無所屬單位

首頁 文獻與幫助
Steamworks 文獻庫
Steamworks API 範例應用程式(SpaceWar)

英文原文已更新

本頁原文在翻譯完成後已再次更新。\r
點擊這裡檢視最新的英文版本。

總覽

為幫助開發者瞭解 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)。如組建或執行失敗,請嘗試以下方法。

組建常見問題

  • Cannot open include file: 'd3d9.h'(無法開啟引入檔:「d3d9.h」)
    如發生此錯誤,代表系統的引入路徑中並沒有 D3D 引入路徑,或是您尚未安裝 D3D SDK。首先,確定下載並安裝了 DirectX SDK(可從 Microsoft 下載中心取得 SDK)。安裝 SDK 後,您需要設置引入路徑。可通過標準 Visual Studio 環境變數改變整個系統的設定,或使用編輯專案屬性單獨更改 Steamworksexample 的設定。
  • Fatal error LNK1104: cannot open file 'd3d9.lib'(嚴重錯誤 LNK1104:無法開啟文件「d3d9.lib」)
    如發生此錯誤,代表系統的程式庫路徑中沒有 D3D 程式庫目錄。請參閱上一項說明,但需要更新的為程式庫路徑,而非引入路徑。
  • Steam must be running to play this game (SteamAPI_Init failed)(必須執行 Steam 才能進行遊戲(SteamAPI_Init 失敗))
    如遊戲運作時發生此錯誤,請確定 Steam 有在正常運作。如 Steam 的運作正常,則確認 steam_appid.txt 檔案是否在遊戲的可執行檔的目錄中。此檔案夾帶於 SDK 範例中,如果您是從 Visual Studio 執行,或直接從偵錯或發佈子目錄執行時,此檔案必須存在。

    當您在 Steam UI 外直接從 exe 啟動遊戲時,此檔案必須存在。檔案當中只有一行數字,即為遊戲的 AppID (Valve 將為您的每個遊戲分配一個 AppID,範例遊戲的 AppID 為 480)。當您通過 Steam 釋出自己的遊戲時,便不再需要此檔案,Steam 會在遊戲啟動時自動偵測您的 AppID。

  • The application has failed to start because steam_api.dll was not found. Re-installing the application may fix this problem(由於找不到 steam_api.dll,應用程式啟動失敗。重新安裝應用程式也許能解決此問題)
    要執行遊戲,steam_api.dll 必須與範例遊戲的可執行檔放在同一個目錄下。這同樣適用於您自己有使用 Steamworks 的遊戲。Visual Studio 專案檔案在組建時應已將可執行檔放在適當的目錄中,但如果您使用的是不同的編譯器,或修改了解決方案或專案檔案,可能需要自己複製該檔案。您可在推出自己的 Steamworks 遊戲時重新分配 steam_api.dll
  • The application has failed to start because d3dx_??.dll was not found. Re-installing the application may fix this problem(由於找不到 d3dx_??.dll,應用程式啟動失敗。重新安裝應用程式也許能解決此問題)
    此範例是仰賴於 DirectX SDK 中的 D3D9X 協助程式庫的。如果在組建範例的同一台電腦上執行此範例,應能自動找到程式庫。但如果您將編譯後的二進位檔案複製到另一台電腦上,則可能需要安裝 D3D 的可轉散發元件,以和開發電腦上編譯的 D3D9X 版本保持相同。

程式碼總覽

成功編譯並執行 Spacewar! 範例專案後,便可開始閱覽程式碼了。如果您在 Visual Studio 解決方案資源管理器中瀏覽檔案,您可看到程式碼被分為被分為遊戲(Game)和引擎(Engine)程式碼。您可以忽略引擎資料夾中的程式碼 — 這些只是用來支援 D3D 的基本 2D 渲染和基本鍵盤輸入。所有記錄 Steamworks API 用途重要的程式碼都位於遊戲資料夾中。

以下為當中值得一看的部分,以及有關程式碼的簡短說明:
  • Main.cpp – 範例遊戲的主要進入點。
    API 用法如下:
    • 初始化用戶端 API -- API 需要在應用啟動過程的初期初始化。您可參考 Main.cpp 中的 RealMain() 函式的作法。
    • 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 的呼叫。您還可以找到收到拒絕和踢除回應時的處理方式。如果使用者不擁有您的產品,或因為被封鎖或因作弊而被踢除時,Steam 可能會發送這些回應給您。
    • 網路連線 API -- 如果您正在製作一款線上遊戲,您可使用 Steam 內建的網路 API 功能。您可在 SpaceWarServer.cpp 中找到通過 SteamGameServerNetworking() 存取子的 ISteamNetworking API呼叫及其傳回,在遊戲伺服器中的伺服器端用法範例。
    • 遊戲配對和主要伺服器通訊 -- 如果您正在製作一款多人遊戲,並且希望使用 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 帶著更新後的狀態資訊呼叫。從遊戲用戶端接收到狀態更改資訊後,便會通知 Steam 從 ISteamUserStats 介面傳來的,使用者統計與成就的變更。
  • Lobby.cpp/h – 通過大廳進行遊戲配對
    API 用法如下:
    • 通過大廳進行遊戲配對 -- 您可以在 Lobby.cpp 中找到以遊戲大廳實作的遊戲配對的部份範例。Lobby.cpp 透過與 SpaceWarClient.cpp 的緊密合作來處理遊戲配對,所以兩者的內容您都須要了解。研究大廳程式碼時,請特別注意呼叫 ISteamMatchmaking 介面的方法和其回呼。
  • ServerBrowser.cpp/h -- 遊戲內伺服器瀏覽器
    API 用法如下:
    • 通過伺服器瀏覽器的遊戲配對 -- 如果您通過伺服器瀏覽器支援遊戲配對,那麼您可能希望在遊戲中直接提供一個伺服器瀏覽器清單,作為 Steam UI 清單的補充。您可在 ServerBrowser.cpp 中找到如何取得您遊戲的網路伺服器清單,並顯示給使用者的範例。
  • Inventory.cpp/h – 物品庫服務
    API 用法如下:

如果您計畫在遊戲中繼續使用現有的驗證和遊戲配對引擎,您可能需要從 Spacewars.h 中移除 USE_GS_AUTH_API 定義。當您刪除此定義時,範例將無法使用 Steam 身份驗證或遊戲配對,但您仍能使用其他 Steam 功能,例如成就和好友資訊,具體資訊請查看程式碼細節。