分享用Adobe Air向iOS移植游戏的经验

来源:互联网 发布:美萍软件多少钱 编辑:程序博客网 时间:2024/04/30 13:56

作者:Svyatoslav Cherkasov

在这篇文章中,我要分享的是用Flash和Adobe Air针对iPhone平台开发游戏的经验。

简单地说,Air是个支持Flash应用在不同设备(包括iOS、Android、黑莓甚至电视)上运行的平台,在开始以Air为平台开发之前,我对此丝毫不了解。但这不是问题,因为95%的Air应用与普通的Flash应用并无明显区别。

所以,我和团队决定用此为iPhone制作游戏。我们的目标不是赚钱,而是通过实验来证实是否能够在Air上针对iOS制作出流畅的动态游戏。

游戏想法

我们想要尽快做成游戏,所以我们希望游戏玩法满足以下条件:

1、简单,这样我们才能快速地制作出游戏。

2、无需过多的动画和移动物体,因为我们不确定它能否在iOS上流畅运行。

3、采用普通的游戏玩法。

4、无需制作上百个不同的解谜关卡,因为我们不想在这个游戏上花过多的时间。

而且,我们也不想自行发明游戏玩法,也没有足够的时间这么做,所以我们决定克隆其他的游戏。

经过数天的搜索后,我们找到了克隆的目标——《Axe in Face》。


screenshot(from gamasutra)

游戏开发

于是,我们开始了游戏开发工作。

在Air上开发游戏很简单。与普通的Flash游戏开发类似,只有些许不同之处(游戏邦注:多数是些设备独有的功能,比如多点触摸和加速计等)。

接下来,让我们先搁置Flash开发,专注于iOS系统特有的问题。

运行表现

当你针对手机开发应用时,运行表现是最重要的层面。我们希望自己游戏能够表现得像款iOS原生应用。游戏能够像其他iPhone游戏那样流畅地呈现效果。所以,我们尝试了不同的技术,尽量实现这个目标。

但是,需要指出的是,并非所有愿望都能实现。

所以,我们在制作精灵时尝试了多种不同的图像引擎。

1、Flash引擎,位图帧。

首先,当然是不能使用矢量图!矢量图运行非常缓慢,你需要的是只用位图。

我们尝试的首个做法是,简单的Flash电影剪辑,以位图呈现画面帧。

令人惊异的是,它的表现并不糟糕,但还是有一些提升空间。

2、位图传输

接下来,我们尝试的是位图传输。这是开发电脑Flash游戏的常用方法。其想法是,制作1个位图数据,将所有的精灵挨个复制到其中。随后,将其呈现在屏幕上。

这种方法在电脑Flash游戏上很有效,但是在iOS上却失败了。如果采用这种方法,内存运转速度似乎很慢。

3、高级Flash引擎。

经过研究后,我知道了如何提升图像表现以及标准Flash引擎无法良好运转的原因。如果你想要快速播放精灵动画,那么你需要将所有的图像存储在内存中。

当使用标准Flash引擎时,每个新的帧都需要运用内存。在每帧中,Flash引擎都需要处理老图像并为新帧创建新图像。

但是,所有的图像都可以重复使用,所以在使用后无需将其处理。

首先,我们将所有图像数据加载到位图数据矢量中,每帧都有自己的位图数据。然后,我们以每帧为基础制作位图对象,将所有对象都放置在精灵MovieClip中。这样,精灵在呈现单帧的同时也含有所有帧。接下来,我们需要做的是为它们转换可视资产,每次只呈现单个帧。

我们的想法是,所有的图像都能够立即可用,用过的帧在呈现后不会被删除。这样,就无需创建新图像和处理用过的图像。

这种方法确实有效,但是还存在改进的空间。

下个改善的阶段是,我们制作单个位图对象,然后为其加上位图数据,比如main_bmp.bitmapData = bd_frame[i]。

这种做法也很有效,在iPhone 4上可以实现以40帧每秒的速度呈现20到30个动画精灵。

这足以满足我们的需求。

以下是某些运行表现的设计建议:

1、尽量少用动态创建对象。

2、尽量少用鼠标互动对象。使用mouseEnabled和mouseChildren来关闭互动选项。

3、避免移动大型对象。

4、针对所有无动画和无旋转的物体使用cacheAsBitmap。

5、针对其他无动画但需要旋转或改变的物体使用cacheAsBitmapMatrix。

6、不要制作大量ENTER_FRAME监听器。只需制作1个即可。

7、在ENTER_FRAME监听器中计算时间。如果你正以每帧X像素的速度移动一个对象,从上次监听器调用的时间开始计算。

平台特有的问题

Retina vs 低分辨率

应用在屏幕分辨率不同的情况下会有何表现呢?很简单,图像会缩放,当然你需要修改场景缩放代码。

对于同时兼顾iPhone 3/3GS和4/4S的开发者来说,这是件好事。你只需要制作Retina应用,在iPhone 3上运行时应用会自动缩放。

当然,你也可以根据屏幕来呈现不同的图像,但是这看起来似乎很麻烦,所以我们以默认的方式来处理这个问题。

iPhone vs iPad

这个问题与Retina问题相同,也关系到应用的缩放。但是在这种情况中,缩放因素并不是那么出众,所以你需要为iPad游戏制作某些自定义代码和自定义图像。

这正是我们将应用设计为只支持iPhone的原因。或许,以后我们会针对iPad制作游戏的HD版本。

CPU vs GPU

对于图像而言,你可以使用CPU或GPU来编译Air应用。如果使用我们的图像引擎,这两者之间的差别并不大(游戏邦注:差别在10%左右)。

但是我们选择了CPU,因为在GPU下编译会面临某些限制条件。比如,无法呈现效果。这意味着,所有的文字轮廓和阴影都无法呈现。解决方案是,制作空白的位图数据对象,在那里绘制电影剪辑,然后将其放入应用中。因为当你使用“绘制”方法时,它使用的是软件引擎并支持所有的效果呈现。

但是这似乎也相当棘手,且毫无好处可言,所以我们选择使用CPU模式。

其他问题

Adobe Air是国际通用平台。这意味着,如果你需要接入GameCenter等某些iOS设备特有的功能,你需要安装额外的“本地扩展”。这个构建过程令人烦扰,但是一旦弄清来龙去脉,所有的事情就都变得非常简单。

而且,新版Air忽略了手机上的静音开关。所以,我们需要使用额外的本地扩展来实现。

我们整个开发过程都是在PC上完成的。但是到最后阶段,我们发现需要一台Mac电脑。原因在于,将应用上传至App Store只能使用Application Loader软件,而该软件只支持Mac OS 10.6.8及更新版本。

总结

能不能使用Flash Air来编写应用呢?我觉得答案是肯定的。

当然,在表现上会面临许多问题和瓶颈。但是,Adobe正在解决这些问题,承诺在不久将来会获得良好的改善。对于动态游戏而言,现在要制作出能够在带有Retina功能的iPhone 4上完全流畅运行的游戏并不容易。但如果以iPad 2和iPhone 4S为平台,应用运行表现更好。

所以,我们希望Adobe能够将Air打造成真正适合开发游戏的平台。

原创粉丝点击