构建Mac OS X App而不是控制台

时间:2011-01-08 22:39:53

标签: macos porting nsapplication

我有一个应用程序的端口,一个在Mac OS X上运行的游戏。我使用make构建,只添加了几个.mm文件来访问NSApplication,NSWindow和NSOpenGLView的必需品。

  1. 如何将其“转换”为适当的应用程序而不是当前的控制台表单?我是否将其与某物捆绑在一起,如果是这样的话?或者它是某种类型的链接器设置(如在Windows中)?我是否必须使用XCode构建?
  2. 目前我只是“勾选”系统,即轮询它以查找事件而不是正确使用OS X消息泵。你能指点我一些基本的样本或教程,告诉我如何正确地做到这一点,同时仍然能够以固定的帧速率“勾选”我自己的东西吗?我说“样本或教程”,因为我在文档方面是盲目的。
  3. 谢谢!

2 个答案:

答案 0 :(得分:3)

要创建合适的Mac应用程序,您必须创建一个Mac OS X软件包。您可以在Apple网站here上找到精彩的文档。您可以使用标准工具创建它们(我写了一个小的python脚本,用一个简单的.ini文件创建一个包,描述要打包的文件,以及如何构造Info.plist文件)。

基本上,应用程序包只是一个具有.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,仅在有待处理消息时进行迭代。然后,您将定期调用此函数(它与Win32上的PeekMessageTranslateMessageDispatchMessage序列非常相似):

- (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 :(得分:1)

除非你真的想学习一堆特定于Mac的API和XCode,否则你应该只使用SDL。它是一个跨平台的库,可以抽象事件处理,线程和多媒体等内容。它包含XCode模板,允许您构建适当的应用程序包,只需对代码进行最少的更改。使用SDL意味着丢弃您编写的大多数特定于Mac的代码,但它可以大大简化任何未来的端口,并且可以更轻松地为多个平台维护您的应用程序。