从 Godot 到 RPM

随着使用 Godot 引擎开发的游戏越来越多,我们需要学习如何将这些游戏打包为 Fedora.

开发游戏很复杂。 每个游戏的要求不同。 过去,开发人员为每个游戏创建了新的游戏引擎。 随着时间的推移,游戏引擎变得更加通用。 他们适应了一种游戏风格。 一些引擎可以创建各种各样的游戏。

Godot 是一个众所周知的开源游戏引擎。 开源和闭源游戏都使用该系统。 Godot 软件包 Fedora 运行这些游戏,但不存在 RPM 包示例。

无论应用程序如何,大部分包装都是相同的。 RPM 规范文件需要摘要、版本、许可证、描述等。对于构建要求,您需要 godot-headless 包。 Godot 发布 pck 文件,但需要图形用户界面才能运行。 Godot headless 无需图形用户界面即可构建项目。

Linux 无法运行 pck 文件。 通过将 godot-runner 添加到规范的要求部分,游戏可以在安装了 RPM 的系统上运行。 pck 文件并非完全独立于平台,但我相信它适用于所有 Linux 系统。 出于这个原因,可以将构建架构设置为 noarch。

另一个程序的相同设置宏可以提取 tgz 文件。 不存在用于构建 Godot 项目的宏。 您使用 ‐‐export-pack 选项调用 godot-headless。 您指定导出名称和输出文件名。 安装部分只需要在 $RPM_BUILD_ROOT/%{_datadir}/%{name} 中创建一个目录并复制输出文件。 指定文件部分,您就可以构建了。

...

BuildRequires: godot-headless
Requires: godot-runner
BuildArch:      noarch

...

%build
godot-headless --export-pack Linux64 pigeonascent.pck

%install
mkdir -p $RPM_BUILD_ROOT/%{_datadir}/%{name}
install -p -m 644 pigeonascent.pck $RPM_BUILD_ROOT%{_datadir}/%{name}

%files
%{_datadir}/%{name}

...

任何人都可以通过安装包并使用指定的 pck 文件运行 godot-runner 来运行游戏。 在 GNOME 桌面上搜索应用程序将找不到它。 在 GNOME 软件中搜索应用程序将找不到它。

超出最低限度

两个文件可以解决这些问题,但您可能需要第三个文件。 第一个文件允许您从 GNOME 桌面轻松运行游戏。 桌面文件包含程序的名称、如何执行程序以及其他详细信息。

[Desktop Entry]
Name=Pigeon Ascent
Comment=Take care of your own pigeon as they fight
Exec=godot-runner --main-pack /usr/share/pigeonascent/pigeonascent.pck
Terminal=false
Type=Application
Icon=pigeonascent
Categories=Game;RolePlaying;

除了 Exec 条目之外,许多桌面文件还包含 TryExec,用于测试可执行文件是否存在于路径中。 如果包含它,它将是 godot-runner。 在这个例子中,我们称之为 godot-runner。 我们可以创建一个 shell 脚本,让您可以轻松地从命令行运行程序。

对于图标,您可以在 Godot 项目中重用图标。 如果它的大小不合适或者您想要一个可缩放的矢量版本,您将需要创建它。 对于 Pigeon Ascent,图标图像需要在两个方向上都大一像素。

另一个文件将元信息提供给 GNOME 软件。 它包含另一个名称和描述。 它还具有网站链接和屏幕截图。 对于游戏, Fedora 包括开放年龄评级系统。 这提供了描述符以允许父母确定游戏内容是否可以接受。 这 开放年龄评分系统 在您输入游戏信息后生成此部分。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2021 Dennis Payne <[email protected]> -->
<component type="desktop-application">
  <id>pigeonascent</id>
  <metadata_license>FSFAP</metadata_license>
  <project_license>MIT</project_license>
  <name>Pigeon Ascent</name>
  <summary>Take care of your own pigeon as they fight</summary>

  <description>
    <p>
      Take care of your own pigeon as they fight increasingly stronger foes, and
      then facing the legendary Pigeon God at the end… can you keep death far from
      your bird?
    </p>
  </description>

  <launchable type="desktop-id">pigeonascent.desktop</launchable>

  <screenshots>
    <screenshot type="default">
      <image>https://static.jam.vg/raw/777/31/z/30974.png</image>
    </screenshot>
    <screenshot>
      <image>https://static.jam.vg/raw/777/31/z/3097c.png</image>
    </screenshot>
    <screenshot>
      <image>https://static.jam.vg/raw/777/31/z/30982.png</image>
    </screenshot>
  </screenshots>

  <url type="homepage">https://escada-games.itch.io/pigeon-ascent</url>

  <releases>
    <release version="1.5.2" date="2021-07-16" />
  </releases>

  <content_rating type="oars-1.1">
    <content_attribute id="violence-cartoon">moderate</content_attribute>
    <content_attribute id="language-humor">mild</content_attribute>
  </content_rating>
</component>

需要对 RPM 规范进行一些额外的更改以包含这些文件。

添加gdnative

有时 Godot 不足以执行游戏所需的任务。 Gdnative 允许将 C++ 代码添加到项目中。 如果 gdnative 代码被多个 Godot 项目使用,则可以将其打包为单独的项目。 不幸的是,您需要使用相同下载文件名的 godot cpp 和头文件。 不要在规范文件中使用源标记的 url,而是指定重命名的文件并在 url 中包含上面的注释。

# https://github.com/godotengine/godot-cpp/archive/refs/tags/godot-3.3.4-stable.tar.gz
Source1:        godot-cpp-godot-3.3.4-stable.tar.gz
# https://github.com/godotengine/godot-headers/archive/refs/tags/godot-3.3.4-stable.tar.gz
Source2:        godot-headers-godot-3.3.4-stable.tar.gz

构建 gdnative 假设 godot cpp 和 headers 是 gdnative 项目之上的一个目录。 以下准备和构建代码构建 gdnative 项目。

%prep
%setup -q
cd ..
rm -rf godot-cpp
rm -rf godot-cpp-godot-3.3.4-stable
%setup -T -D -b 1
cd ..
rm -rf godot-headers-godot-3.3.4-stable
%setup -T -D -b 2

%build
cd ..
mv godot-cpp-godot-3.3.4-stable godot-cpp
rmdir godot-cpp/godot-headers
mv godot-headers-godot-3.3.4-stable godot-cpp/godot-headers
cd godot-cpp
scons platform=linux generate_bindings=yes -j4
cd ../%{name}-%{version}
mkdir bin
scons platform=linux

安装部分将动态库复制到库目录。 如果您为 godot 项目构建可执行文件,则 gdnative 库在同一目录中工作。 为避免重复,我们创建 pck 文件并使用 godot-runner。 使用 godot-runner 运行时,该库需要与项目中指定的目录位于同一目录中。 通常这将是 gdnative/linuxbsd。

安装 godot 项目与没有 gdnative 的项目相同。 添加到安装部分以创建 gdnative/linuxbsd 目录。 创建指向 gdnative 库的符号链接。 为了运行游戏,您需要在桌面文件中添加一个 Path 条目,并将其设置为 pck 文件所在的目录。 这会导致程序从允许它找到 gdnative 库的目录运行。

去哪儿

鸽子上升 正在等待批准添加到 Fedora 随着 Gdnativegamerzilla. My Pinball Disc Room 需要 Gdnativegamerzilla 才能提交。 Pigeon Ascent 的开发人员还创建了我推荐的 Diver Down。 Godot Wild Jams 是寻找 Godot 游戏的好地方。

Godot 4 的开发仍在继续。 它不会向后兼容。 我不知道如果 Fedora 将同时发布这两个版本,或者如果我们需要将游戏转换为新的 Godot。 他们计划有一个工具来帮助转换。