【问题标题】:Game cross-compiling and packaging游戏交叉编译打包
【发布时间】:2010-03-08 13:34:11
【问题描述】:

我和一些朋友想开发一款游戏。任何语言都可以。我已经用 C 编程多年,但以前从未写过游戏。我们中的一个人对 SDL 略知一二。这也是学习 Python+pygame 的一个很好的借口。

我们希望我们的游戏是“独立的”。所谓独立,我的意思是大多数用户(至少 Linux、Mac 和 Windows)不需要手动下载和安装除软件包之外的任何其他东西。如果安装自动处理缺少的依赖项,则可以。如果包包含二进制文件,我们希望能够使用 Linux 的交叉编译来生成它们。

我们应该如何打包和构建项目,什么语言最适合?

【问题讨论】:

  • 我见过一些旧的 DOS 游戏移植到多个操作系统,例如 eduke32 (eduke32.com),你看过那些吗?还有另一个名为 Allegro 的库,旨在实现跨平台兼容性 (allegro.cc)。

标签: python c cross-platform packaging cross-compiling


【解决方案1】:

如果您以前没有编写过游戏,我建议您从 Python 和 Pygame 开始。如果您已经是一名程序员,那么 Python 本身很容易学习,所以这对您来说不会有太大的飞跃。

使用 Pygame,您几乎不需要花时间编写“胶水”或处理诸如窗口管理和声音设置之类的普通低级细节 - 您几乎可以立即编写游戏逻辑,并且很快您就会成为 blit左右ing。更重要的是,让您的游戏原型运行起来非常容易,因此您可以开始试验这些机制 - 我在几个小时内编写了一个简单的小型横向滚动平台游戏。

性能

Python 与 Pygame 的性能对于简单的游戏来说通常是不错的,尽管“平滑滚动”游戏可能会表现出很差的性能,尤其是在 Linux 上(根据我的经验,至少 - pygame.display.update() 字面上每帧需要 15-30 毫秒Linux 和 Windows 上的 4-5,带有便宜的英特尔显卡,尽管这是两年前的事了,Linux 英特尔驱动程序最近有所改进)。此外,如果您有大量物理/数学代码,Psyco 可以为您带来巨大的加速(在某些情况下为 20% - 200%),但您将被限制为在 x86 计算机上使用 32 位 Python。

一旦你解决了大部分游戏逻辑,如果性能仍然不能令人满意,你可以切换到 C 和 SDL。由于您已经编写了游戏逻辑,因此您只需专注于直接处理 SDL。即使这样也应该相当容易——Pygame 内部使用 SDL,所以翻译应该相对简单。

OpenGL

不幸的是,上述情况仅在您编写 2D 游戏时才成立 - Pygame 对 OpenGL 基本上没有帮助。但是,我建议使用 OpenGL 开始游戏编程。一开始可能很难理解,所以你会同时遇到两个问题 - 首先,你试图弄清楚如何获得游戏逻辑/物理/人工智能/等。工作,然后你很难理解 OpenGL。最终学习 OpenGL 是值得的,但不是从头开始 - 最好从基础开始并从那里开始。

跨平台注意事项

就跨平台问题而言 - py2exe(适用于 Windows)和 py2app(适用于 Mac)允许您构建包含您的依赖项(包括 Python 解释器和 Pygame)的单个可执行文件;但是,我认为您无法从 Linux 环境构建可执行文件(您可能必须能够借用 Windows/Mac 计算机几分钟)。对于 Linux,您可能只需分发一个 .deb,将 Pygame 列为依赖项(必要时将 Psyco 列为 Recommends 或 Suggests)。

【讨论】:

    【解决方案2】:

    看看Ogre;它是 Torchlight 背后的引擎。它支持 Windows、Ubuntu、MacOS 和 iPhone。

    您可能还想阅读Gamasutra:他们的文章、采访、深入分析和事后分析为游戏开发过程提供了非常有趣的见解。

    【讨论】:

    • Ogre 的界面非常糟糕(充满了动态分配和单例)。当有许多明显更好的选择时,我不会推荐它。
    • 您能与我们分享这些替代方案吗?
    【解决方案3】:

    这在很大程度上取决于您是要构建包括引擎在内的整个游戏,还是仅在已建立的游戏引擎上构建。虽然构建一个完整的引擎需要更多的开销和艰苦的工作,但它会给你带来大量的经验。

    现在如果你想创建一个游戏引擎,工作的语言是C++(C也可以,我只是更喜欢C++)

    对于构建管理工具,我发现使用CMake 是一个不错的选择,它可以在多个不同平台上为您管理构建,它甚至还可以创建安装程序,并安装任何所需的库。

    至于库,您的大部分问题将由 SDL 解决,使用起来不是特别愉快,但它管理了与视频(OpenGL)、窗口、输入和音频的跨平台接口的头痛。您仍然需要学习 OpenGL 才能在游戏中使用它,SDL 只处理初始化和设置。

    现在对于使用 Python,我不推荐它,除非您的游戏很简单(2D 或没有大量物理使用的简单 3D),因为 Python 产生的大量开销将开始侵蚀您的帧速率。对于轻量级的脚本语言,Lua 绝对是最好的,它简单、灵活、快速。要集成它,如果您想要一个简单的解决方案,请使用LuaBind,但要小心!在你使用它的地方要非常有选择性,因为它可以完全杀死你的编译时间!

    【讨论】:

      【解决方案4】:

      我建议您在 QT 上开发它... QT 将自行处理大部分可移植性问题...所以您不必担心它,而且它支持大多数平台,包括手机...而且QT对游戏也有很好的原生支持(Graphics,UI,Sound Controls..)

      Please see application Built in QT

      【讨论】:

        【解决方案5】:

        我认为您的游戏是 3D 游戏。如果是,那么您需要 OpenGL。它是 C,所以你会熟悉语法,但方法有点不同,因为 OpenGL 是一个有限状态机。有关此主题的更多信息here

        OpenGL 基本上在每个平台上都是内置的,因此您只需要启动一个全屏窗口并让 OpenGL 处理绘图。对于交叉编译,我会推荐 wxWidgets 即 C++。它将允许您为在每个平台上编译的应用程序的窗口初始化编写单个代码。

        wxWidgets 也有一个python binding,如果你决定使用 python,在这种情况下你还需要PyOpenGL

        【讨论】:

          【解决方案6】:

          对于休闲游戏,我推荐 Flash

          【讨论】: