Я пытаюсь перенести библиотеку игр на iPhone. В отличие от SDL, эта библиотека не полностью контролирует вашу функцию main(), она обменивается с помощью быстро возвращающихся функций из вашего собственного кода. Так, например, очевидный псевдокод:
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 в этом потоке. Либо передайте все события по потокам (ть), либо просто поставьте поток UIApplicationMain в режим сна и используйте CFRunLoop в основном потоке. Я слышал, что UIApplicationMain не нравится запускаться в другом потоке.
- Игнорировать UIApplicationMain полностью, просто используйте NSRunLoop. Будет ли отсутствовать важная настройка iPhone? Кто знает!
- Сделайте что-то ужасное с помощью longjmp(), чтобы выскочить из кода UIApplicationMain после установки, молите, чтобы он не делал ничего важного во время срыва.
Предложения?