移植 Cocos2d IOS 到 Cocos2d-x Android 设备上 博客分类: cocos2d-x iosandroid
程序员文章站
2024-03-08 21:45:46
...
最近在帮朋友移植一个 IOS 上的 cocos2d 游戏到安卓平台,CPP 的代码量大致在一万行左右,说大也不大,但也着实不小。移植了几天,吐槽一把:
由于现在还没有这样的自动化工具,所以很大一部分还是需要靠我们人工来转换,但这并不表明我们不能偷一些懒。对于一些可以自动化做掉的,当然直接替换掉,比如:
cocos2d-x 中没有直接对应的NSNumber类,基本上你可以使用CCString然后调用它的floatValue()啊之类的函数。但有时候还是不够直接。因为 Objective-C 中可以使用id这个类型,可以使用isClassOf() 等这样的动态查询的函数,这个时候直接移植过来就有些麻烦了。要么一股脑全部弄成CCObject,然后运行时调用 C++ 的 dynamic_cast<T>(v) 来做。
总的来说,移植过程还是很直观的,因为 cocos2d-x 和 cocos2d 在 API 的命令上都尽量保持了一致。
后记:
自己在前面写了怎么将 cocos2d 改成 cocos2d-x 的经历,现在将一些默认的操作完善成了一个简单的工具,注意这个只是半自动的工具,还是有很多未完善的功能。这个工具并不顾及 objective-c 的语法,如果我们能理解 objective-c 的语法,那么就可以更加好的进行转换。这个就当成下一步的目标好了。:)
代码的仓库在github的这里
欢迎大家集思广益,贡献代码 :-)
由于现在还没有这样的自动化工具,所以很大一部分还是需要靠我们人工来转换,但这并不表明我们不能偷一些懒。对于一些可以自动化做掉的,当然直接替换掉,比如:
- 将 [self 替换成 this-> 是肯定没有错的。
- 还可以把 ]; 替换成 );
- - (void) 替换成 void CLASSNAME:: 基本上也是不会大错的,当然了,如果Objective-C的几个类的实现都放在一个文件里面,那确实会出现问题。
- CGGloat可以被typedef成float,或者索性全部替换成float
- Objective-C 里面对于NSMutableArray的遍历写起代码来是很方便的,但是在 cocos2d-x 中就不是了,对于 CCArray的遍历比较麻烦一些,基本上这个样子:
CCObject *pObj = NULL; CCARRAY_FOREACH(array, pObj) { CCSprite *sprite = (CCSprite*)pObj; ... }
cocos2d-x 中没有直接对应的NSNumber类,基本上你可以使用CCString然后调用它的floatValue()啊之类的函数。但有时候还是不够直接。因为 Objective-C 中可以使用id这个类型,可以使用isClassOf() 等这样的动态查询的函数,这个时候直接移植过来就有些麻烦了。要么一股脑全部弄成CCObject,然后运行时调用 C++ 的 dynamic_cast<T>(v) 来做。
总的来说,移植过程还是很直观的,因为 cocos2d-x 和 cocos2d 在 API 的命令上都尽量保持了一致。
后记:
自己在前面写了怎么将 cocos2d 改成 cocos2d-x 的经历,现在将一些默认的操作完善成了一个简单的工具,注意这个只是半自动的工具,还是有很多未完善的功能。这个工具并不顾及 objective-c 的语法,如果我们能理解 objective-c 的语法,那么就可以更加好的进行转换。这个就当成下一步的目标好了。:)
代码的仓库在github的这里
欢迎大家集思广益,贡献代码 :-)