在iPhone上使用SDL可能會遭遇到的問題

来源:互联网 发布:java构造方法的理解 编辑:程序博客网 时间:2024/05/16 05:08

SDL(Simple DirectMedia Layer)是個開放原始碼的程式庫,主要提供一些開發多媒體應用程式會需要的機制,像是對聲音、影像、鍵盤、搖桿、滑鼠等等的控制機制。它最不可被取代的優點在於跨平台,現在支援的平台多不勝數,Linux、Windows、Windows CE、Mac OSX、FreeBSD之類的平台就不用說了,像SymbianOS這種手機專用的平台,它也都支援。而和本文主旨有關的是,它也支援了愈來愈流行的iPhone。


不過,實際上使用時,我發現了一些問題。


第一個問題是,當你自己在iPhone上寫了一個應用程式,再去link SDL(當然是iPhone版本)時,你會發現它裡頭也有一個main()。倘若你打開SDL的source code,看到video/uikit的SDL_uikitappdelegate.m時,你會發現main()就在這裡頭,而且還註冊了自己的SDLUIKitDelegate。一山不容二虎,你要嘛移除它的main(),不然就得拿掉你自己的。如果你想要移除它的main(),就得解決其他類別和它相依的地方(shareAppDelegate這個class method以及window這個property)。如果你想拿掉你自己的,可以將你自己原有的main()更名為SDL_main()-這是SDLUIKitDelegate會在applicaitonDidFinishLaunching裡去負責呼叫的。無疑的,你接著再把你自己原先寫在applicaitonDidFinishLaunching(ObjC的命名慣例下的名稱通常都不會太短呀XD)裡的程式碼,移到SDL_main()裡,相當於是在進行串接的動作。最後,取消SDLUIKitDelegate之applicaitonDidFinishLaunching裡的exit()動作。


這麼一來,等於是放棄自己的main(),而讓SDL裡頭的UIKit實作來做為應用程式的啟始點。當你這麼做之後,你就可以把自己的AP和SDL整合在一塊執行了。


某種程度來看,這其實是個有點奇怪的設計,做為一個程式庫,讓自己搖身一成了程式的入口了。不過,換個角度來想,它的設計方式,應該是為了便利原先就已經利用SDL開發的程式移植到iPhone上,而不是針對利用UIKit來建構應用程式而設計的。所以,這麼想的話,倒也不會太奇怪了。


iPhone有個天生的限制,他的每個應用程式,都只能有一個視窗,也就是說如果SDL建立主視窗的話,就會是這個視窗。所以,你的AP必須和UIKit共用同一個視窗,你可以透過控制SDLUIKitDelegate的window屬性來存取這個共用的UIWindow物件。


最後,iPhone的UIKit實作裡頭,都假設自己會佔去整個視窗,所以,如果你不希望它佔去整個視窗,而是希望它只是被放在某個位置上,那麼你也會需要修改SDL做點加工,修改一SDL_uikitwindow.m、SDL_uiopengles.m這兩個檔案


转帖:http://www.javaworld.com.tw/roller/qing/entry/%E5%9C%A8iphone%E4%B8%8A%E4%BD%BF%E7%94%A8sdl%E5%8F%AF%E8%83%BD%E6%9C%83%E9%81%AD%E9%81%87%E5%88%B0%E7%9A%84%E5%95%8F%E9%A1%8C

原创粉丝点击