《Running Panda》作者的移动游戏开发心得分享

今天呢·无比懒散的DreamFairy作为一个骑行者狂飙了一下午后,回到电脑前。看到社区里之前做 “熊猫快跑” 的作者放出了心得啦。于是乎,果断转载过来。 DreamFairy也打算参加 腾讯的线上游戏开发项目呢。

以下是文章原文啦:

原文作者:Hack86????

? ?? ?随着Air2.6大面积推广,Adobe毫不忌讳的踏入了移动领域。在苹果手机和安卓手机大肆PK的今天,平台市场和内容市场也新兴而起,笔者也拿起了笔,不对,准确的说是键盘和鼠标,来尝试一下,如何用熟悉的ActionScript3来开发一款可以跨平台的游戏。

?


??????打开Flash Builder 发现新建里多了两个清新的选项,那就传说中的手机项目,新建后发现和普通项目并没有什么不同,只是多了一个主类同名的XML文件,用他可以配置一些手机上的特性,比如开关GPU,比如横屏锁定等等,除了这个几乎和别的AS项目没有任何不同的地方,感觉完全没有任何门槛,只能一个字来表示,那就是:刺激。

? ?? ? 在移动平台中开发思路上可能会有些变化,但是总体上没有任何问题,以下是我开发收集的一些经历,比如我们习惯性用键盘按键来发射子弹,但是平板手机中是没有键盘的,所以改成了触屏,而这在PC上表现为鼠标点击,所以实现就变得通俗容易,并且测试的时候也是用鼠标点击,在细节上会有些变化,比如按钮的划过状态在手机上消失,因为手机上快走指针,只有点击,同理监听MouseMove事件的时候 不用再判断是否MouseDown 因为在手机上不可能在未Down的情况下促发Mouse事件,这些都是一些细节上的不同,但是在实现上方案和传统的一样容易,所以为移动所付出的额外代价只是这些细节,如果你开发3个平台以上的话,那么这些细节需要多多考虑,但是比起重新开发三个版本,那这成本几乎是可以忽略不计的。所以还是那两个字:爽。

? ?? ?启动游戏后,在手机上运行了下,效果没有想象的好,FPS一路走低,由于AS3的所有事件都是被异步优化后基于Frame来执行的,所以虽然理论上帧率过了24就可以消除卡的感觉,但是24fps状态下的操作延迟将近40多毫秒的延迟手感和体验都是比较差的,特别是对于动作游戏,如果你是策略的菜单游戏,那么24基本就可以接受了。但如果要做动作游戏,还是要达到普通人类下意识反应速度18毫秒以内,也就是55fps以行。那么优化也是一个非常大的问题,其实很多朋友会把过多的优化思考在变量的多少或者对象的GC上,其实他只是内存优化,而帧率的根本问题还是画面重绘。AS3是非常高级的语言,我们不需要太多低级的操作方法,只需要在画面上让重绘区域尽量减少,让重绘区域中的层数尽量维持在最少的图层,并且全部都使用位图,如果担心文件体积过大,可以导入矢量素材,用bmp来转换成位图也是一个很好的方法,当然手机资源有限一定要注意释放。经过以上基本简单的优化和设计上的规避,笔者的第一款游戏成功的达到了55fps以上,当我看到帧率发生了如此明显的变化后,我真是激动不已,如果你有兴趣的话,也马上动手来试一试把。……

 

 

 

 

AS3 Bitmap 和 beginBitmapFill 很有趣呐~

昨天测试网游的时候,发现同步其他人动作的时候,出了个神奇的bug. 只同步了阴影,人物的皮肤还停留在原地不动。

于是检查了下代码,发现阴影填充Bitmap,之后addChild(Bitmap) 。这应该是阴影和贴图不同步的原因。 但是嘛~之后做了个Demo似乎又没问题了。嘛~总之不管它了,换一个方法来实现。

索性就用 graphics.beginBitmapFill。然后呢 beginBitmapFill 是第一次用啊,一开始以为直接把 BitmapData丢进去就好了。结果发现显示不出来。然后就在那冥思苦想啊。然后觉得 有Begin嘛,肯定又要有End 于是加了个 endFill() 还是显示不出来。 于是就想莫非还要画个形状?

于是使用如下代码完成了整个贴图的绘制:

 

        /**玩家皮肤**/
            _bmd=skin;
            this.graphics.beginBitmapFill(_bmd,new Matrix(1,0,0,1,-_bmd.width/2,-_bmd.height),true,false);
            this.graphics.drawRect(-_bmd.width/2,-_bmd.height,_bmd.width,_bmd.height);
            this.graphics.endFill();
            /**绘制阴影**/
            this.graphics.beginFill(0x000000,.7);
            this.graphics.drawEllipse(-20,-20,40,20);
            this.graphics.endFill();

果断成功了,有木有。因为都是直接画上去的,不是addChild上去的。所以皮肤和阴影都是一体的。

AS3 45度地图人物贴图与自动寻路

嘛~之前的服务端和客户端都完成了呢,感觉很有成就感。 但这只是网游的基础通信部分啦。

最近把客户端方面的引擎做完了。

包含了以下技术呢:

1.自动人物贴图,可以将一张8*8的人物素材图,自动切割合并成动画数组,然后动态调用。可以说写成了一个可以复用的模块呢。

2.45度地图引擎,参考了许多老外的实例,还有<FLASH高级动画教程>还有论坛上许多朋友的例子。总算自己写了出来呢。

还有好多很有趣的小技术啦。

下面是实例哦:[玩法:鼠标点击地图上有方块地点,人物就会自动绕开障碍走过去哦~]

AS3 客户端 JAVA服务端使用 Socket 连接 AMF传输数据

在进入正题之前,先来电前情提要的说~

一周前,嚷着要做一个【FLASH客户端,JSON数据包,SOCKET连接,MYSQL数据库。ASWING框架。】网游的DreamFairy,在努力奋战3天,结果如下。。。

ASWING用起来很给力,界面很清爽,灵活性很高,还附带一个图形化界面编辑器。但是!很悲催的是采用了ASWING的项目,即使这个项目只有不到10k!它都要编译20秒左右。。。我实在没有耐心,果断放弃ASWING。

JSON可以十分简单的封装一个对象,其优势是没有XML那么复杂的各种节点。但是其实自身的废节点还是很多的说(一个月前,DreamFairy完全没听说过JSON为何物)。但是,之前做聊天室的时候,都是传ooxx=A&xxoo=B 这样的长字符串。确实没JSON封装的好啊。所以就抱了个死理,一定要用JSON做数据包传输。在AS3中只需要一个JSON类即可。但是在JAVA里解析JSON数据包,就需要JSON-LIB和其依赖的4个包。。。我好不容易找齐它们,结果用起来十分的麻烦。最后不得不放弃,难道DreamFairy又要用回ooxx=A&xxoo=B这样来传输数据么?

搜索遍各种后台技术后,发现了一个叫amf的协议。是adobe为flex开发的一种数据传输协议,可以把对象转换为二进制耶。于是果断放弃JSON,采用amf来做数据传输! 下面进入正题。

由于之前完全用过amf,等于是从0开始学了。连续2个通宵查找amf的教程,大部分都是amfphp的。java的资料非常少。在网上找到部分的代码。如下:

继续阅读“AS3 客户端 JAVA服务端使用 Socket 连接 AMF传输数据”

命运的齿轮已经开始转动

命运的齿轮已经开始转动,不达到既定的命运,便不会停止呢~

两周的台风天终于过拉,福州也终于开始是晴天了。闲置了2周没骑的山地车,昨天骑去江边兜风了一圈回来,双腿疼死了。啊啊!果然我平时还是运动太少了啊。

下半年的计划已经确定了呢~java服务端(VS太大了,笔记本装不下),FLASH客户端,JSON数据包,SOCKET连接,MYSQL数据库。ASWING框架。设计模式模块化。年底的FLASH PLAYER 11 3D。 完成一个多人3D网游吧~

啊啊~我果然是个技术宅啊,研究技术真的是一件很爽的事情。有时候真的感觉自己就像神一样的创造着一个个虚拟世界,给虚拟世界创建自然法则。

然后~放上小圆脸某合唱角色曲: