资深开发者:谈手游跨平台移植的简易技巧

jopen 9年前

随着免费工具的日益增多,游戏移植已经变得越来越容易,尤其是手游平台。不过,想要把 Java 时代的早期手游移植到 Android 和 iOS 平台,如果使用这些工具可能没有那么方便,如果依赖于某个工具,那么你就有可能面临版本大改而重写大量代码的风险,或者有新的平台出现,你就必须等待该工具推出对应版本,这很容易导致错过机会。最近,笔者找到了一个从事手游研发十多年的资深开发者的博客,他在文中讲述了如何用最简单的方式在 Java、Android 和 iOS 以及 HTML5 之间进行游戏移植,以下是完整的博文内容:

资深开发者:谈手游跨平台移植的简易技巧

我上一款游戏《Chrono&Cash》也成功地移植到了 HTML 5 平台,而且做出来的效果还非常不错,已经可以上架销售了。和往常一样,有很多人问我做移植的时候使用了什么库、框架或者工具,所以我觉得是时候说说我的游戏移植经验了,这样下一次再有人问的时候,我就可以直接让他们来看这篇博客。

首先需要说明的是,为什么我不实用跨平台库或者工具呢?因为我有强迫症,我希望知道我的代码都有什么作用,而且要知道它们什么时候、为什么被用到。其实市面上有非常不错的跨平台解决方案,但我总是害怕需要在游戏代码方面有所妥协。如果这些工具背后的制作人或者公司突然停止支持了怎么办?如果他们突然改变了工具,我就必须改变自己的游戏代码或者做游戏的方式,这时候又怎么办?

我从来不觉得使用其他人的标准代码有什么灵活性,而且用起来总是感觉很笨重,也满足不了我的要求。我还发现运行自己的代码可以让我快速地进行游戏更新或者为新设备或者特别的东西(比如 Joypad 和 iCade)进行代码适配,这样可以带来非常不错的业务机会,如果我要用别人的框架,可能就必须等待他们为特定的设备推出特定版本的工具,这是很不方便的。

说了这么多,我要指出的是,的确有非常优秀的工具可以使用,但本文并不是讲述如何使用它们的。

我过去经常做 Android 游戏研发,近些年来也做了一系列的框架,可以处理一款 Android 应用的所有需求,而且这些代码还具备运行主线程(main threads,比如 gameloop,logic loop,rendering 等等)所有的条件,还可以处理各种手柄的输入问题,我处理所有的事情都只用了少数 class 而已,在我所有的新项目中,我基本是都会复制和粘帖三四个 class。

除了这些 class 之外,我当然还有一些做游戏移植的小技巧,所以我经常从之前的游戏中复制和粘帖一大堆的 class 来处理游戏中的敌人、子弹、特殊效果、玩家代码等等。这是一个非常不错的快速做创意代码非常不错的方式。你唯一需要担心的事情就是,旧的函数或者变量肯呢个最终不会使用,但仍然会在初始化的时候被调用,而且没有简单的方式可以解决。

一旦我的游戏运行并且在 Android 平台完成之后,在我觉得它可以上架销售的时候,我会开启 xCode,在 Object-C 编写的 iOS 框架中创建一个新项目。

iOS 框架基本上和 Android 框架的功能相同,但很明显有根本的差异,因为它们是不同的系统。虽然 iOS 框架也要处理输入、线程和 iOS 应用的所有阶段,但 iOS 框架没有一行代码是和 Android 版本完全相同的。

我大多数的时间都是调整这些框架,有时候可能需要做完好几个游戏才能把一个框架调试到对的状态。在 Android 平台我是基于近些年的很多次框架进行了调整,只是简单地适应了 Android 系统的变化。而在 iOS 平台,我一直在提高框架处理不同设备参数的能力,因为一开始移植游戏的时候,我甚至不知道该怎么办,比如旋转、静音按钮和其他类似的东西。

一旦在 iOS 平台创建了新项目之后,‘有趣的’部分就开始了。针对每一个 Android class 文件夹(玩家、怪兽、fx、子弹),我都会创建一个同名的 iOS Class 文件夹,然后把 Android 代码复制粘帖到这些 class 文件夹里。

然后我检查每一行代码并且进行必要的修改,这似乎是显而易见的,或许是非常大的工作量。但实际上,大多数不同语言的代码其实并没有那么大的差异,比如下图,是我的游戏《Chrono&Cash Monster》的 Java(Android)和 Object-C 版本的初始化 class 对比:

资深开发者:谈手游跨平台移植的简易技巧

你可以看出的是,它们之间的差别很小,再看下面这张图,是把一些真实的游戏 logic 从 Java 转化到 Object-C 的部分代码:

资深开发者:谈手游跨平台移植的简易技巧

所以,最后一张图是实际的游戏 logic,基本上占据一款游戏 80%-90% 的代码,而这两者几乎是使用了同样的代码。

现在做一款新游戏的时候,我还需要牢记一些事情,当我做 Android 游戏的时候,我还会思考特定的代码或者解决方案是否在 iOS 平台可行,这样在版本移植的时候可以省去很多的问题。

把我的 Android Java 代码移植到 JavaScript 基本上是非常容易的,因为这两个语言的相似性太高了。HTML5 框架功能也很简单,只是处理浏览器的输入、渲染和线程,基本是可以解决大多数的问题。

我还在游戏中为所有的文本都使用预渲染图片,在移植到新平台的时候,这也可以节约时间和避免很多问题。只要你能够在一个平台上渲染图片,那么这些文本的渲染就不会有任何问题。

还有些比较小的事情可能一时之间没有想起来,但上面说的这些事情在你首次移植一款游戏的时候都会遇到,你的第一款移植游戏可能是耗时最长的,因为你还在学习编程技巧和语言,不过一旦有了自己的框架并且知道如何编译特定代码的时候,就会变成小菜一碟。

来自: 游戏大观