无所属单位

主页 文献与帮助
Steamworks 文献库
Steamworks API 示例应用程序(SpaceWar)

原文内容有作更新

此页原文在翻译版发布之后作了更新。
点击此处查看此页更新后的英文版本。

概览

为帮助开发者了解 Steamworks API 的使用,我们在此提供了经典多人射击游戏Spacewar! 全功能版的源代码。此游戏是一个简单的 2D 游戏,支持最多 4 位玩家,它可以很好地展示许多 Steamworks SDK 中 API 的使用。

当您查看代码时,请记住,我们的目标是编写一个简单精炼的游戏,尽可能清楚地展示 Steamworks API 的用法。您不会在这里看到任何华丽的新图像技术;相反,我们希望您能找到清晰的示例,能清楚地说明如何将 Steamworks 的功能整合到您自己的项目中。

在示例代码中演示的 API 和 Steamworks 的功能包括:

  • Steam 社区整合 (头像、好友名称等)
  • 崩溃报告
  • 好友
  • HTML Surface
  • 库存
  • 排行榜
  • 对战匹配(通过大厅和服务器浏览器)
  • 多人游戏验证(游戏内支持 4 位玩家)
  • 网络连接
  • 统计与成就
  • 语音聊天

spacewar.png

示例的生成与运行

要求:
  • Visual Studio 2005 或更新版本
  • 2010 年 6 月后的 DirectX SDK (可从 Microsoft 下载中心下载)
  • Steamworks SDK (下载最新发布)

下载并解压 Steamworks SDK 程序包后,找到名为 SteamworksExample 的子目录。在此子目录中,您会发现可用 Visual Studio 打开的 SteamworksExample.sln。打开该解决方案并编译项目。如果编译成功,即可直接从 Visual Studio 运行该项目(您需要在后台运行 Steam)。如生成或执行失败,请尝试以下技巧之一。

常见生成版本问题

  • 无法打开包含文件:'d3d9.h'
    如遇到此错误,意味着您的系统包括了一个路径,但该路径不包括 D3D 包含路径,或者您尚未安装 D3D SDK。首先,确保下载并安装了 DirectX SDK。(可从 Microsoft 下载中心获得 SDK)安装 SDK 后,您需要设置包含路径。可通过标准的 Visual Studio 环境变量来完成此系统设置,或通过编辑项目属性来设置 Steamworksexample 项目。
  • 严重错误 LNK1104:无法打开文件 'd3d9.lib'
    如遇到此错误,意味着您的系统库路径不包括 D3D 库目录。请参阅上述说明,但需要更新库路径,而非包含路径。
  • 必须运行 Steam 才能玩此游戏(SteamAPI_Init 失败)。
    如在运行游戏时遇到此错误,请确保 Steam 正常运行。如 Steam 正常运行,则确保游戏可执行文件的目录中带有 steam_appid.txt 文件。此文件附带了 SDK 示例,如果您从 Visual Studio 中运行,或者直接从调试或发布子目录中运行,该文件则应该存在。

    当您直接从 exe 启动游戏时,在 Steam UI 之外,此文件必须存在,且必须包含一个带有游戏 AppID 的单行(Valve 将为您的每个游戏分配一个 AppID,示例游戏的 AppID 为 480)。当您通过 Steam 发布自己的游戏时,不需要此文件,因为当游戏启动时,Steam 会自动检测到您的 AppID。

  • 由于 steam_api.dll 文件不存在,应用程序启动失败。重新安装该应用程序可解决此问题。
    为确保成功运行,steam_api.dll 必须和示例游戏可执行文件放在相同的目录中。对于您自己的使用 Steamworks 的游戏,也同样适用。Visual Studio 项目文件应在生成时将可执行文件放在适当的目录中,但如果您使用的是不同的编译器,或修改了解决方案或项目文件,可能需要自行复制文件。您可在推出自己游戏时重新发布 steam_api.dll
  • 由于 d3dx_??.dll 不存在,应用程序启动失败。重新安装该应用程序可解决此问题。
    该示例需要依靠直接使用 DirectX SDK 的 D3D9X 帮助库。如果在生成该示例的同一台电脑上运行此示例,应能自动找到该库。如果您将编译后的二进制文件复制到另一台电脑上,则可能需要安装 D3D 可再发行组件,以获得与开发电脑上编译的 D3D9X 版本相同的版本。

代码概览

在编译并运行了 Spacewar! 示例项目后,您可以开始查看代码。如果您在 Visual Studio 解决方案资源管理器中浏览文件,您将看到代码已被分解为游戏(Game)和引擎(Engine)代码。您可以忽略引擎文件夹中的代码 — 它只用来支持通过 D3D 的基本 2D 渲染和基本键盘输入。所有记录 Steamworks API 用途的重要代码都位于游戏(Game)文件夹中的。

下面简要概括了查看代码的要点:
  • Main.cpp -- 示例游戏的主要入口点。
    API 用法显示如下:
    • 客户端 API 初始化 --您需要在应用启动过程中进行 API 初始化,您会看到它在Main.cppRealMain()中的示范。
    • API 错误/警告日志 -- 在开发过程中,您需要从 Steam API 中获得一些日志输出,以帮助进行问题调试。您可在 RealMain() 中看到一个设置调试日志记录的示例,其中调用了 ISteamClient::SetWarningMessageHook
    • 崩溃报告 -- 您需要在游戏中使用 Steam 的内建小型转储崩溃报告。如果使用了该报告,您会看到一个安装异常处理程序和设置小型转储的示例,该示例写在 Main.cppWinMain()MiniDumpFunction() 中。
  • SpaceWarServer.cpp/h -- 示例游戏的服务器代码
    API 用法显示如下:
    • Gameserver API 初始化 -- 在游戏服务器中,您需要初始化一个没有公开的个人用户界面的精简版 API。您将在SpaceWarServer.cpp 中的CSpaceWarServer 的构造器中找到此版本。
    • 运行 API 回调 -- 在您的游戏中,您需要定期运行 Steam 回调来处理来自 Steam 异步 API 调用的结果。通过在 CSpaceWarServer::RunFrame() 函数中的 SteamGameServer_RunCallbacks,您将在游戏服务器中找到一个运行回调的示例,并且您将在 CSpaceWarServer的构造函数代码和头文件中找到处理个别回调的示例。
    • 多人游戏验证(VAC 封禁处理) -- 如果您开发的是一个在线多人游戏,则需先确认该用户已拥有游戏,再允许他们加入在线服务器。您将找到回调处理程序以及在SpaceWarServer.cpp中使用的ISteamGameServer API 调用。您还将看到如何处理拒绝和踢出反馈的示例,当用户不拥有您的产品,或者用户被禁止或因作弊被踢出时,Steam 可能发送给您这些反馈。
    • 网络连接 API -- 如果您正在生成一个在线游戏,您可以利用 Steam 内置的网络 API 功能。您将通过使用SteamGameServerNetworking()访问器的ISteamNetworking API调用,以及在SpaceWarServer.cpp中的回调,在游戏服务器中找到服务器端的用法示例。
    • 匹配与主服务器通信 -- 如果您正在生成一个多人游戏,并且希望使用 Steam 服务器浏览器,那么您的游戏服务器将需要与 Steam 主服务器通信。您将在 CSpaceWarServer 构造器和CSpaceWarServer::SendUpdatedServerDetailsToSteam() 方法中找到相关示例。
  • SpaceWarClient.cpp/h -- 示例游戏的客户端代码。
    API 用法显示如下:
    • 通过大厅进行对战匹配 -- 在您的在线游戏中,您可能希望通过大厅,而不是通过服务器浏览器来加入对战匹配。您可通过SpaceWarClient.cpp内的 ISteamMatchmaking 接口,找到使用大厅代码和回调的示例。您也可以查看 Lobby.cpp/h,其中包括一些用于既有大厅中处理状态和回调函数的代码。
    • 好友与社区整合 – Steam 允许玩家在游戏中使用丰富的身份信息,包括他们的昵称和个人头像。您将通过 SpaceWarClient.cpp 内的 ISteamFriends 接口,找到将人物昵称和头像整合到计分板中的示例。

    • 网络连接 API -- 您将在 SpaceWarClient.cpp 中找到客户端使用 Steam 网络 API 的示例(请参见 SpaceWarServer.cpp,了解服务器端的实现)。
  • StatsAndAchievements.cpp/h -- 示例游戏的统计与成就处理。
    API 用法显示如下:
    • 统计与成就 -- 您可以在 StatsAndAchievements.cpp 中查看处理统计与成就的实现方法。该文件包括 CStatsAndAchievements 类,它从 CSpaceWarClient调用,带有更新状态信息。从游戏客户端接收到状态更改信息后,它就会通过 ISteamUserStats 接口通知 Steam 用户统计与成就的更改。
  • Lobby.cpp/h – 通过大厅进行对战匹配
    API 用法显示如下:
    • 通过大厅进行对战匹配 -- 您可以在 Lobby.cpp 中找到基于游戏大厅实现的对战匹配的部分示例。Lobby.cppSpaceWarClient.cpp 紧密合作来处理对战匹配,因此您需要了解这两项内容。当检查大厅代码时,请特别注意 ISteamMatchmaking 接口方法的回调和调用。
  • ServerBrowser.cpp/h -- 游戏内服务器浏览器
    API 用法显示如下:
    • 通过服务器浏览器的对战匹配 -- 如果您通过服务器浏览器支持对战匹配,那么您可能希望在游戏中直接提供一个服务器浏览器,作为 Steam UI 列表的补充。您将会在ServerBrowser.cpp.中找到获取您游戏的互联网服务器列表,并将其显示给用户的示例。
  • Inventory.cpp/h – 语音聊天
    API 用法显示如下:
    • Steam 库存 – 与 Steam 库存 整合,提供 Steam 经济体的访问权限。这使您可以轻松地将物品整合到您的游戏中。

如果您计划继续在游戏中使用现有的验证和对战匹配引擎,您可能需要从 Spacewars.h 中移除 USE_GS_AUTH_API 定义。当您删除此定义时,它将导致示例无法使用 Steam 身份验证或对战匹配,但您仍能获取其他 Steam 功能,例如成就和好友信息,具体信息请查看代码细节。