本文为aojgame翻译,转载请注明出处。

译者注:我认为这将是一个令人兴奋的消息,libgdx的作者已经开始开发对IOS的移植了,该框架目前已经能支持PC,android,html5三个平台。这是本人第一次翻译外文,英语水平有限,请大家多多指正。附上原文地址

作者:Mario

我已经开始再次开始做libgdx的iOS移植工作。代替Avian,我们现在打算使用MonoTouch。这意味着你必须要掏出399刀来买MonoTouch的许可证。当然你还需要一台Mac和苹果的一些设备,你还将不得不与苹果公司签署99刀的开发者协议。

不过还有其他的方法来做这个事情,比如mac in the cloud,远程的Mac租赁服务,其中有安装MonoTouch的许可证。我不确定该许可允许您发布应用,但它是一种廉价的方式来测试您的应用程序是否适用于iPhone模拟器,无需掏钱就能开发这个被金砖围起来的花园。

对于技术细节。 MonoTouch是一个基于Mono的全栈式iOS应用开发环境。 Mono是一个用Microsoft’s .NET平台实现的开源平台,随着C#成为使用最多的开发语言(也有其他的,比如F#,看起来非常有前途)之一。你用C#来写应用,通常需要使用MonoDevelop,和基于Mono的IDE。几乎所有的本地IOS的API都经过了C#的封装,所以你不必去接触Objective-C。

所以,你怎样才能在该平台上运行Java?一年前,我尝试使用iKVM。IKVM是一个了不起的项目,让您编译Java字节码到.NET /Mono的CLR,并增加了完整的通用性就像是JRE的实现。这是一个极其巨大的努力,长期以来一直在编译,检出他们的项目。

现在,如果你点击最后一段的链接,你会看到libgdx已经能在C#.NET /Mono上运行。让这些能够通过MonoTouch在IOS上运行是一个不同的大工程。 在iOS上代码需要被编译为本地代码,如果您购买了MonoTouch的许可证就能用Mono做到。Mono支持不同的配置,每个支持的特定功能,如运行时库或反射支持。 IKVM依赖一些桌面配置文件的功能,然而Mono对于iOS却不支持这些特点。要使IKVM能在IOS上运行必须解决这些问题,通过修改iKVM的本身。

这里我参考了Michael Bayne of Three Rings。他是Spiral Knights的一个开发成员,这是相当成功的Java游戏。他目前与PlayN团队工作(实际上,他现在似乎是PlayN的BE),正在大力改善这个游戏,并把它搬到新的平台。其中一个平台,就是iOS。他修改iKVM来兼容Mono的IOS配置文件,并把他的修改放到Github上。我目前唯一解决的“挑战”也就是JNI的支持,这个PlayN目前并不需要。这些问题解决以后,开发libgdx IOS后台的工作开始了。 TL;DR:感谢Michael为MonoTouch和iKVM的对接做出了神奇的贡献,没有这个我们就不可能做到现在正常做的事情。

现在,又有什么样的挑战在纠缠libgdx支持IOS呢?这里有一个小的清单,我会在未来的几天尽力去解决:

项目结构 (Done)

第一步是设置一个有点清晰的项目结构,让我写在Eclipse中写后台代码的时候,能切换到MonoTouch来编译。最终的结果可以在这里找到。有一个Eclipse项目包含后台的Java代码(见src /文件夹)。再有就是XCode项目负责生产的libgdx.a的库文件,包含我们所有珍贵的本地代码。最后,还有一个MonoTouch项目,用来把所有这些事情放到一起,让我很容易地测试到后台的变化。它有一个编译前的步骤,确保为iOS建设时使用了最新的Java代码。

在libs /文件夹包含所有iKVM的编译Java代码到CLR的必要工具,加上JAR文件封装Objective-C库,通过iKVM来使用MonoTouch的C#封装器生成。

简明的生命周期 (Done, 差不多)

项目结构到位后,我可以启动一个简单的后台的实现工作。它所需要做的是安装应用程序和GL表面展现层来记录设施。生命周期的处理目前不是100%的声音(暂停/恢复 或者其他?),我仍然要弄清楚IOS处理事情的逻辑并映射到我们的API。

文件系统

下一步是要实现IOS的输入接口。它看起来应该是一帆风顺的,我们可以把所有文件类型(内部的,classpath中的,本地的,外部的,绝对的)。这里是对这个方法的正式文档,以及相应的MonoTouch 文档,以供参考。自从IKVM能访问到java.io,我们可以用我们的FileHandle 类重复使用几乎所有的东西,这在很大程度上依赖于InputStreams 和 File。

OpenGL 接口

MonoTouch有对本地的OpenGL ES绑定的封装,称为OpenTK(也可在桌面应用上使用)。对于我们来说,这几乎是无用的,所以我必须写我自己的封装。值得庆幸的是,那个东西已经在Andr​​oid的版本中,这就能非常简单的将它移植到iOS。我唯一​​需要改变的是不依赖于Harmony’s 缓冲区内部(可参见此处),我已经为我们过时的Angle后台做过这些。

Input

这似乎是毫无阻碍的,IOS触摸的API似乎要比Android的少一些。键盘输入将会是有趣的探索,虽然这里我不期待任何大的问题(这也可能会把我爆菊)。

Audio

这是迄今对我最大的未知。 IOS支持OpenAL,有一个API类似Android的MediaPlayer。使用OpenAL意味着,我们自己要做所有格式的转码,这些我宁愿避免。这将是第一种方式来实现AudioDevice和AudioRecorder以及播放内存中的声音效果。MediaPlayer这样的API可能不适合声音效果。我会尽力设计一个不错的音频库,而不是用iOS的。

这个周末,我会尽力完成至少文件I / O和图形部分的后台。现在我将重点放在GLES 2.0,通过参考一些Android的源码来写GLES 1.x中的封装,虽然对我来说并不是是首要任务。

下面是截图,如果文字表述不够刺激。它只是表明MonoDevelop中,一些输出测试本机代码和模拟器上运行很简单ApplicationListener,使用OpenTK来渲染。