【问题标题】:Building Mac OS X App instead of console构建 Mac OS X 应用程序而不是控制台
【发布时间】:2011-06-05 21:55:25
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: macos porting nsapplication


    【解决方案1】:

    要创建一个合适的 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];
    }
    

    【讨论】:

    • 我无法访问具有从 .ini 文件构建 Mac OS X 捆绑包的脚本的计算机,但如果您认为您可能感兴趣,我会在周一尝试发布。跨度>
    • 听起来不错!非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 谢谢,不过我更喜欢自己做,也想学。
    猜你喜欢
    • 2012-01-24
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多