2011-01-08 109 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