2011-01-08 67 views
0

我有一個應用程序的端口,一個運行在Mac OS X上的遊戲。我使用make構建,只添加了幾個.mm文件以訪問NSApplication,NSWindow和NSOpenGLView。構建Mac OS X應用程序而不是控制檯

  1. 如何將其「轉換爲」與當前控制檯形式相對應的適當應用程序?我是否將它捆綁在一起,如果是這樣的話?或者它是某種類型的鏈接器設置(如在Windows中)?我必須使用XCode構建?
  2. 目前我只是「打勾」系統,即輪詢它的事件,而不是正確使用OS X消息泵。你能否指點我一些基本的示例或教程,告訴我如何正確地做到這一點,同時還能夠以固定的幀速率「打勾」我自己的東西?我說「樣本或教程」,因爲在文檔方面我是盲目的。

謝謝!

回答

3

要創建一個合適的Mac應用程序,您必須創建一個Mac OS X包。您可以在Apple網站上找到偉大的文檔,here。您可以使用標準工具創建它們(我編寫了一個小型python腳本來創建一個簡單的.ini文件的包,描述要打包的文件以及如何構建文件)。

基本上,應用程序包只是一個帶有.app擴展名和固定結構的常規目錄。需要以下文件:

Application.app/ 
    + Contents/ 
    + MacOS/ 
    | + <Executable> 
    + Resources/ 
    | + <Icon> 
    + Info.plist 

Info.plist文件是一個標準的屬性列表文件(無論是在XML還是在老格式),這表明什麼是可執行文件(CFBundleExecutable)的名字,是什麼圖標文件的名稱(CFBundleIconFile),捆綁類型(CFBundleType,值爲APPL)以及其他一些信息(支持的文件類型,版本字符串,開發語言...)。這些文件是具有基本Mac OS X應用程序所需的最低限度的要求。

有關Mac OS X消息泵如何工作的說明,我建議您閱讀Matt Gallagher的article。他解釋了NSApplication類的運行消息是如何實現的。然後,您可以編寫此方法runOnce,該方法只有在存在未決消息時纔會迭代。然後,您將定期調用這個函數(這是真的類似PeekMessageTranslateMessage,並且DispatchMessage序列在Win32):

- (void)runOnce 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self finishLaunching]; 

    for (;;) 
    { 
     [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 

     NSEvent *event = 
      [self 
       nextEventMatchingMask:NSAnyEventMask 
       untilDate:nil 
       inMode:NSDefaultRunLoopMode 
       dequeue:YES]; 

     if (sender == nil) 
      break; 

     [self sendEvent:event]; 
     [self updateWindows]; 
    } 

    [pool release]; 
} 
1

除非你真的想學習一堆Mac特定的API和XCode,否則你應該只使用SDL。它是一個跨平臺的庫,它抽象事件處理,線程和多媒體。它包含XCode模板,可以讓您通過對代碼進行最少的更改來構建適當的應用程序包。使用SDL意味着丟棄您編寫的大部分Mac特定代碼,但它將大大簡化未來的任何端口,並且可以更輕鬆地爲多個平臺維護您的應用程序。

+0

謝謝,但我更喜歡做我自己,我也想學學。 – 2011-01-08 23:11:57

+0

SDL是一個很好的學習來源! – 2011-01-09 05:32:20

相關問題