用html5写游戏,会面临一系列的问题,情况很复杂。而当下热衷于html5开发游戏的,有两拨不同的人——熟悉dom、css、js、web2.0的传统前端开发工程师和熟悉canvas的传统游戏开发工程师。这两拨人的背景截然不同,所以在很多问题的处理上有出入。
1)js语法简单,很多高级一点的语法特性都没有,不适合直接拿来开发大型项目。
js核心语法只经过一个星期就设计完成了,很仓促。它在设计之初主要是为是给页面写一点“表单验证”之类的小功能,它是基于对象的语言,但extend、mix-in、import等语法都没有提供,因为打从一开始js之父从没想过有一天js会变得如此重要。在web2.0时代,有大量的DHTML需求,所以大型一些的js框架都会着手解决“大型项目可维护性”方面的问题,扩展js语言,通过封装api模拟高级语法特性,例如YUI3和Dojo。
extend和mix-in之类的还好解决一点,特别值得一提的是js模块化问题。js原生不提供import和包的机制,所以聪明的工程师自己封装了相关的api,更在近两年形成了commonJS规范。模块化、动态加载、依赖处理非常非常重要,不解决这个问题,很难优雅地处理大型项目。
html5游戏,首先它得是个js大型项目。web site在这些年积累了很多这方面的经验,html5游戏开发者应该吸收这些经验,不要写出web2.0以前的js代码水平。
2)html5是web前端技术,有web方面的特殊性。
比如说跨域问题、http优化、BOM相关接口。这些都是传统前端开发方面的知识,我敢说一大半的游戏开发工程师们不清楚JSONP是干嘛的。比如原生ajax和cookie的接口非常难用,总是要封装一下才好用的,包括1)里所讲的语法扩展,都是web开发相关的,但其实和游戏又没有直接的关系。html5游戏引擎是不方便处理这些的。这些内容可以交给传统前端的框架来做。
3)canvas和DOM,不同的GUI套路。
这是个巨大的鸿沟。前端们非常熟悉的三大基本元素html + css + js,传统游戏开发工程师们很陌生。特别是神器css,传统游戏工程师们很排斥,他们知道这个东西很好,却提不起兴趣学习,他们害怕浏览器兼容问题。他们号称开发html5游戏,其实只敢用canvas相关的子集。现在绝大多数的html5游戏引擎都是基于canvas的,纯canvas。
其实css是个巨大的神器,在GUI编程方面性价比奇高。css的api设计得如此简单却出奇强大!在桌面端已经有很多软件使用c++做个框,框里套个html,所有的GUI全是用html+css+js来实现的。在移动终端phonegap也是同样的思路。
纯canvas虽然省却了css、dom、浏览器兼容的学习成本,却主动放弃了css和dom引擎提供的大量帮助。捡芝麻丢西瓜。
4)大量不同终端和平台的适配。
html5适用的终端包括pc、移动设备甚至平板电视。操作系统有windows、ios、android、win8等主流平台,还有blackberry、web os、chrome os、ubuntu touch、firefox os,甚至wii u等非主流平台。不同的操作系统、不同分辨率、不同物理尺寸。游戏的尺寸该如何取舍?是放任缩放还是做响应式设计?浏览器能否全屏?浏览器状态栏有多高?是否是从主屏打开的(ios设备)?是横屏还是竖屏?
除了上面的这些操作系统,还有人人网、微博、微信这样的平台,也是html5游戏可以发布的地方,这些地方对接入的游戏尺寸又有哪些要求和限制?我能改页面的viewport吗?还是要将游戏的根结点进行scale缩放?
除了游戏的尺寸要适配,还有输入设备也要适配。pc的输入设备是键盘和鼠标,移动设备的输入设备是触摸屏和重力感应。什么设备使用虚拟十字键,什么设备键盘操作就行了,我们还需要对当前的终端做嗅探。
适配问题是个巨大的问题,终端多也就罢了,还很可能在不停地变化,系统升个级或者出来个新设备什么的,适配方面的工作还得持续更新。这些,游戏引擎们考虑过吗?考虑得完善,能应付我的定制需要吗?引擎更新得频繁和及时吗?
5)引擎可拆解吗?可扩展吗?粒度小吗?加载方便吗?
游戏其实是有很多种类的,act、ftg、rpg、arpg、slg、avg等等等等,可以是横版卷轴、赛车、弹珠台、也可以是拳皇、机器人大战和愤怒小鸟,不同的游戏类型界面和交互截然不同。我们总说游戏引擎,但其实没办法通过一个万金油的引擎开发出完全不同类型的游戏。游戏引擎应该分成core部分,和一系列的可选moudle,比如base.js、rpg.js、act.js、slg.js等等,开发rgp游戏就加载base.js+rpg.js,开发act游戏就加载base.js+act.js。需要物理引擎就加载物理引擎模块,需要寻路功能就加载寻路模块。
思路是不是觉得很熟悉?jQuery和jQuery UI、YUI core和widgets就是这么干的。在游戏引擎方面,我们也应该使用相同的组织方式。那么前面提到的模块化就是必要条件了。不熟悉传统前端开发的工程师们,知道requireJS是什么吗?在设计引擎的时候,能很好解决这个问题吗?
6)引擎成熟吗?有大量商业应用吗?api稳定吗?文档齐全吗?
web site领域,jQuery成了工业标准,大家都敢用,很信任它。可是html5游戏引擎领域,还没有出现这样的工业标准。经常看到《25个HTML5和JavaScript游戏引擎库》《200个html5游戏引擎一览》这样的文章,事实上在做web site时,我也经常看到《25个js框架》或者《25个css框架》这样的文章,但我也就扫两眼,从不真的看进去,我很清楚工业标准是谁,工业标准有多重要。html5游戏开发领域,外部情况极其复杂,而引擎还处在一个非常初级的探索阶段,api不稳定,文档不完善,甚至项目停止维护了。谁也没成为工业标准,谁也拿不出几个商业应用——这和html5游戏开发商本就很少有直接关系。
【结语】:
html5开发游戏的门槛很高,web site的高级前端工程师都很难招,更别说web app的前端工程师有多难找了,能做web game的前端工程师更是稀有,现在敢玩html5游戏开发的公司,应该都有非常灵魂的技术人员,我担心的这些问题,这些灵魂工程师们肯定也都会担心。对于这些人来说,开发一个自己的游戏引擎并不是件难事,与其依靠这些让人放心不下的开源引擎,不如自主研发引擎更让人踏实。
现在大多数写html5游戏引擎的工程师,背景都不是传统前端工程师,他们对browser、js、css和web site积累的经验知之甚少。我对此很不放心。