我正试图将游戏库移植到iPhone上。与SDL不同,这个库不能完全控制你的main()函数,它通过你自己的代码中的快速返回函数进行通信。因此,举例来说,明显的伪代码:如何从iPhone应用程序中删除UIApplicationMain?
int main() {
library_init();
// game init code here
while(we_have_not_quit_the_game) {
library_message_loop();
library_init_render();
// render stuff
library_end_render();
// update game state
}
library_shutdown();
}
iPhone使这个困难,因为它需要你调用不会返回UIApplicationMain功能。在library_init();之后,根本无法回到用户代码。
我不相信这是必要的 - 有NSRunLoop据说可以用来处理事件。但是,我不知道UIApplicationMain是否有其他重要的功能。 (请注意,我没有计划使用.nib文件,这是我发现UIApplicationMain做的唯一的其他事情。)
我有三个真正的想法,我可以想到,但他们都是一个主要的实施工作,所以我想知道如果有人有这方面的经验,我烧了一天尝试注定的想法。
- 在Init中,产生一个新线程,在该线程中运行UIApplicationMain。要么通过线程传递所有事件(ugh),要么只是让UIApplicationMain线程进入睡眠状态,并在主线程中使用CFRunLoop。我听说UIApplicationMain不喜欢在不同的线程中运行,但是。
- 完全忽略UIApplicationMain,只是使用NSRunLoop。我会错过重要的iPhone设置吗?谁知道!
- 使用longjmp()在安装后跳出UIApplicationMain代码做一些可怕的事情,并祈祷它在拆卸过程中不做任何重要的事情。
建议?
排序,是的。更具体地说,我宁愿让用户完全控制游戏循环 - 我在引擎库上构建的引擎已经在Windows和OSX中做了一些非传统的东西,我想保留这种非常规性。老实说,我想提供这个,不仅仅是为了允许未修改的main()(尽管这确实是一个很好的好处),但是因为我认为它实际上是一个比事件更好,更有用的API布局驱动布局iPhone似乎很喜欢。 有时你只需要做一些古怪的东西。 – ZorbaTHut 2010-02-03 00:52:44