我正試圖將遊戲庫移植到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