0

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

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

谢谢!

4

2 回答 2

3

要创建一个合适的 Mac 应用程序,您必须创建一个 Mac OS X 捆绑包。您可以在 Apple 网站上找到出色的文档,请点击此处。您可以使用标准工具创建它们(我确实编写了一个小的 python 脚本来从一个简单的 .ini 文件创建一个包,该文件描述要打包的文件以及如何构造Info.plist文件)。

基本上,应用程序包只是一个带有.app扩展名和固定结构的常规目录。需要以下文件:

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

Info.plist文件是一个标准属性列表文件(XML 或旧格式),指示可执行文件CFBundleExecutable的名称是什么( ),图标文件的名称是什么(CFBundleIconFile),包类型CFBundleType( of APPL),以及其他一些信息(支持的文件类型、版本字符串、开发语言等)。这些文件是拥有基本 Mac OS X 应用程序的最低要求。

为了解释 Mac OS X 消息泵的工作原理,我推荐阅读 Matt Gallagher 的这篇文章。他解释了 NSApplication 类的运行消息是如何实现的。然后,您可以编写此方法 runOnce,仅在有待处理消息时进行迭代。PeekMessage然后您将定期调用此函数(它与 Win32 上的、TranslateMessageDispatchMessage序列非常相似):

- (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];
}
于 2011-01-08T23:13:19.300 回答
1

除非您真的想学习一堆特定于 Mac 的 API 和 XCode,否则您应该只使用SDL。它是一个跨平台库,抽象了事件处理、线程和多媒体等内容。它包括 XCode 模板,允许您构建适当的应用程序包,而对代码的更改最少。使用 SDL 将意味着丢弃您编写的大部分 Mac 特定代码,但它将大大简化任何未来的端口,并使您的应用程序在多个平台上的维护变得更加容易。

于 2011-01-08T23:09:22.810 回答