Q版格斗游戏《口袋战士NOVA》开发心得[原创]
酝酿了一下,决定写一篇《口袋战士NOVA》的开发心得,其实是把我所遇到和解决的问题做个整理,也希望对大家以后开发游戏有帮助。
《口袋战士NOVA》一共开发了10个月时间。由于是第一次写这么复杂的游戏,我前面写的那一堆小游戏的总开发长度都没这一个游戏开发周期长。项目变大之后,很多以前不是问题的事情成了问题。现在只能做一件事就是,改正,下次不犯了。
先说一下《口袋战士NOVA》官方网站:http://pf.gedou.com
大家可以去先去玩一下,很搞笑的Q版格斗游戏。
好,切入正题(注:以下仅代表个人观点,请选择性接收,欢迎指正错误)
1.了解你将要开发的游戏
恩,你要开发哪一类的游戏,先要对那一类的游戏比较熟悉,如果不熟悉,请连续玩一段时间,对游戏整体有个感觉了再开始构架游戏。如果你是这一类游戏的资深玩家,开发出来的游戏可玩性将大增,你知道在什么地方该注意以增加游戏可玩性。
结论,请多玩你要开发的同类型的游戏。
2.编码规范
如果是个很小,几个类就解决问题的项目,可能看不出问题,可是一旦项目规模达到一定规模,一个规范,结构清晰的代码将给维护带来很大的便利,否则代码很有可能会失控。
首先是命名规范。
变量名,采用“类型”+“名称”的方式命名
常用的命名参考:
mc : MovieClip (影片)
bt : Button (按钮)
b : Boolean()
n : Number
s : String
a : Array
bmd: BitmapData
pic : Bitmap
类名,采用“名词”,函数名采用“动词”
例如,有个“坦克”的类,里面有“创建坦克”,“装弹”,“开炮”等函数,很容易让人理解。
库里面的元件,尽力用英文来命名,导出名和元件名称相同,非常便于管理。尽量不要使用拼音。
你也许和我命名习惯不一样,这个也没关系,你自己习惯就行,团队合作的话,需要将编码规范统一起来
自文档化编程(重点)
一个类文件里,多少注释合适呢?答案是,不知道。
没有规定说多少注释是好或者不好,但是,有个原则是,你尽可能的“自文档化的编程”思想来写你的代码。
什么是“自文档化编程”呢?(我是从《编程匠艺》上学的,有兴趣的话,请看原版),意思就是编写可读性很强的代码,机器能读懂,人也能读懂,即使没有注释一看也能明白写的是什么。
在关键的地方使用注释,大部分时候请用代码描述代码自己。
这么做的目的就是方便,代码规模变大之后,你还能轻松的掌控住自己的代码。
《口袋战士NOVA》一共34700行代码。168个类,不算太大,我也是遵循这个原则来开发的,可控性还好。
3.效率or代码可读性
FLASH是有效率问题的,有时候为了效率,会牺牲掉代码的可读性,用最高效的方式去写一个算法。
但请注意,大部分时候,都不要做为了效率牺牲可读性的事情,否则,代码是非常难维护的。
只有当你确定,那个关键点是整个游戏的效率瓶颈,改善了那里的效率就能使整个游戏效率有很大的提高,并且不得不用人难懂,但机器执行效率高的方式去写的时候,你才可以牺牲一点可读性。并且尽可能的维持在一个函数中处理算法,注释清楚,方便修改。
不要为了效率放弃代码可读性,这一点怎么强调都不为过。当代码规模变大的时候,越可读的代码,越让你觉得轻松。
4.mc or bitmapData
开发游戏的角色使用mc(影片)还是BitmapData?
我以前用AS2开发过很多的游戏,都是使用mc的,mc的优点是很直观,所见即所得,占用内存很少,缺点是效率不高(当效率是瓶颈的时候是缺点,其他时候可能也不算)。BitmapData的优点是效率高,管理有些麻烦,占用内存高。
小问题,为什么mc效率没Bitmap高呢?
mc中的位图在编译后,是以shape形式存在,也就是说,使用的是矢量渲染器渲染,进行位图填充,效率很低。
mc中的矢量图片,也是用矢量渲染器渲染,复杂的图像,非常耗cpu。
BitmapData的是将数据存在内存中,真正的位图渲染,效率非常高。
你可以用一个影片内放一个hitarea(检测范围)的方式做角色
也可以将整个角色的动画以bitmapData的形式存进数组中,模拟mc的方式做角色。
当效率不是问题的时候,前者非常容易开发。
当效率很重要的时候,可以选择后者来做,《口袋战士NOVA》是采用Bitmap+Array来控制角色动画的,效率很高。
5.显示和数据检测分离
接上面,用mc做角色的问题还在于,显示和数据检测是联在一起的,单机游戏可能也没什么问题,因为在本地基本上代码执行是实时的,不存在大延迟现象,就算延迟了几十毫秒,也不会有什么问题。
但是要做联机对战的话,问题就来了,两个客户端通过网络传递数据后,有延迟,数据并不是实时的,但显示是实时的,不同步了,这个时候,就需要将显示和数据分离,适当的时候可以让角色做过渡性的动作弥补数据的延迟(其实就是电脑骗一下玩家),保持画面的流畅,这个是很有必要的。Bitmap+Array+数据队列方式,可以很好的做联机应用。
注:上述理论对于及时对战游戏更贴切些,社区类的,等非即时的联机游戏,影响会稍微小一些。
口袋战士是要开发成联机对战版本的,目前还没写完,所以这个不展开讨论了,以免误导大家。
6.创建资源和释放资源
用C语言写东西的时候,需要自己管理内存,创建什么,后面还要自己释放什么。用as开发一般可以不用自己管理内存了。
但是注意了,当你游戏中使用大量的内存的时候(Bitmap+Araay),你需要管理好你的内存。
写类的时候,你创建了什么资源,数组、BitmapData,更改了什么属性,你要写个函数,释放资源,恢复属性。这个事前要想好,否则,后面在一堆代码里去找那些该释放,哪些改恢复,是非常头疼的事情。
我写《口袋战士NOVA》的是前面没注意,后面花了几天时间专门整理这个,而且还提心吊胆的,害怕有遗漏就麻烦了。
以后的编码我自己会注意这个问题啦,特别是大项目。