Steamworksドキュメント
Steamworks APIのサンプルアプリケーション(SpaceWar)

概要

開発者のみなさんにSteamworks APIの使い方についての理解を深めてもらうために、典型的なマルチプレイヤーシューティングゲームのSpacewar!の全ソースコードを用意しました。 これは、最大4人のプレイヤーをサポートするシンプルな2Dゲームで、Steamworks SDKで利用可能な多くのAPIを紹介するのに最適なサンプルです。

コードをご覧になる際、このゲームはSteamworks APIをできるだけわかりやすく紹介するために、シンプルで必要最低限の機能だけを実装したゲームである点をご理解ください。 ここには目新しいグラフィック技術などはありませんが、あなたのプロジェクトにSteamworks機能を深く統合する際に参考にできる明確な例が紹介されています。

サンプルコードで紹介しているAPIとSteamworksの機能:
  • クラウド
  • コミュニティ統合(アバター、フレンド名、他)
  • クラッシュレポート
  • フレンド
  • Steam HTML Surface
  • インベントリ
  • ランキング
  • マッチメイキング(ロビーとサーバーブラウザー)
  • マルチプレイヤー認証(ゲーム内で4人のプレイヤーをサポート)
  • ネットワーク
  • データ&実績
  • ボイスチャット

spacewar.png

サンプルコードのビルドと実行

要件:
  • Visual Studio 2005以降
  • DirectX SDK
  • Steamworks SDK (最新リリースをダウンロード

Steamworks SDKパッケージのダウンロードと解凍が完了したら、SteamworksExampleというサブディレクトリを見つけてください。 ディレクトリ内にあるSteamworksExample.slnを、Visual Studioで開きます。 ソリューションを開いてプロジェクトをコンパイルします。 コンパイルが成功すると、Visual Studioから直接プロジェクトを実行できるようになります(バックグラウンドでSteamが実行されている必要があります)。 ビルドまたは実行に失敗した場合は、以下のヒントを試してみてください。

一般的なビルドの問題

  • Cannot open include file: 'd3d9.h'
    このエラーは、システムインクルードパスにD3Dインクルードパスが含まれていないか、またはD3D SDKがインストールされていないことを意味します。 まず、DirectX SDKがダウンロード/インストールされていることを確認してください。 SDKをインストールしたら、インクルードパスを設定する必要があります。 これは、標準のVisual Studio環境変数でシステム全体に設定するか、またはプロジェクトプロパティを編集してSteamworksExampleプロジェクト専用に設定することもできます。
  • Fatal error LNK1104: cannot open file 'd3d9.lib'
    このエラーは、あなたのシステムライブラリパスがD3Dライブラリディレクトリを含んでいないことを意味します。 上記の説明をご覧ください。ただし、インクルードパスの代わりにライブラリパスを更新する必要があります。
  • Steam must be running to play this game (SteamAPI_Init failed).
    ゲームの実行中にこのエラーが発生した場合は、 Steamが実行されていることを確認してください。 Steamが実行されている場合は、ゲームの実行ファイルがあるディレクトリに、steam_appid.txtファイルがあることを確認してください。 このファイルはSDKのサンプルに同梱されており、Visual Studio内から、またはDebugやReleaseサブディレクトリから直接実行した場合には存在するはずです。

    Steam UIを介さずゲームを直接起動する場合、このファイルが存在する必要があり、ファイルにはゲームのAppIDを含む1行が含まれている必要があります(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をサンプルゲームの実行ファイルと同じディレクトリに置く必要があります。 これはSteamworksを利用するゲームにも当てはまります。 Visual Studioのプロジェクトファイルは、ビルド時に実行ファイルを適切なディレクトリに配置しますが、別のコンパイラを使用した場合、またはソリューションやプロジェクトファイルを変更した場合、実行ファイルを自分でコピーする必要があるケースもあります。 steam_api.dllは、リリース時にあなたのSteamworksゲームと共に再頒布できます。
  • The application has failed to start because d3dx_??.dll was not found. Re-installing the application may fix this problem.
    このサンプルは、DirectX SDKに同梱のD3D9Xヘルパーライブラリに依存します。 ビルドした同じマシンで実行すれば、ライブラリは自動的に検出されるはずです。 コンパイル済みのバイナリを別のマシンにコピーする場合、開発マシンでコンパイルしたのと同じバージョンのD3D9Xを取得するために、D3D再頒布可能パッケージをインストールしなければならない場合があります。

コード概要

Spacewar!サンプルプロジェクトをコンパイルし、実行できたら、コードを検証してみましょう。 Visual Studioソリューションエクスプローラー内でファイルを検索すれば、コードがゲームとエンジンコードに分割されていることがわかります。 Engineフォルダー内のコードは無視してかまいません。コードは、D3Dを介した基本的な2Dレンダリングと基本的なキーボード入力をサポートします。 Steamworks APIの使用を記述した重要なコードはすべてゲームフォルダー内にあります。

コードの検証を始めるにあたり、最も興味深い部分について、以下で簡単に説明します:
  • Main.cpp -- サンプルゲーム用のメインエントリポイント。
    APIの使用法:
    • クライアントAPIの初期化 --アプリ起動時の初期段階にAPIを初期化する必要があります。初期化方法は、Main.cpp内のRealMain()関数を参照してください。
    • APIエラー/警告ログ記録 --開発中はデバッグに役立つよう、Steam APIのログファイルを出力しておくとよいでしょう。 RealMain()関数内でデバッグログを設定する例を確認できます。そこでは、ISteamClient::SetWarningMessageHookが呼び出されます。
    • クラッシュレポート -- Steamが持つミニダンプクラッシュレポート機能のゲーム内での利用を検討してみてください。 使用する場合は、Main.cpp内の、WinMain()MiniDumpFunction()に、例外ハンドラーのインストールとミニダンプの出力設定の例があります。
  • SpaceWarServer.cpp/h -- サンプルゲームのサーバーコード。
    APIの使用法:
    • ゲームサーバーAPIの初期化 -- ゲームサーバー内で個別のユーザーインターフェイスを公開しない、必要最低限のAPIを初期化してください。 これは、SpaceWarServer.cppCSpaceWarServer用のコンストラクターで実行されます。
    • APIコールバックの実行 -- ゲーム内で定期的にSteamコールバックを実行し、Steamの非同期API呼び出しからの結果を処理する必要があります。 ゲームサーバーでSteamGameServer_RunCallbacks経由でコールバックを実行する例は、CSpaceWarServer::RunFrame()関数内にあります。また、個々のコールバックの処理や登録例については、CSpaceWarServerコンストラクターコードとヘッダーファイルを参照してください。
    • マルチプレイヤー認証(VAC禁止処理) -- ゲームがオンラインマルチプレイヤーゲームである場合、 オンラインサーバーへの参加を許可する前に、ユーザーがゲームを所有していることを確認してください。 これらの目的のために、SpaceWarServer.cpp内で使用されるISteamGameServer APIへのコールバックハンドラーと呼び出しがあります。 また、ユーザーが製品を所有していない場合や、チート行為のためユーザーが禁止またはキックされている場合に、Steamがゲームに送信する拒否やキックの応答を処理する方法も含まれています。
    • ネットワークAPI -- オンライン ゲームを開発している場合は、SteamのビルトインネットワークAPIの利用をお勧めします。 SteamGameServerNetworking()アクセサーを使用するISteamNetworking API呼び出し経由のゲーム内サーバーのサーバー側の使用例、およびSpaceWarServer.cpp内のコールバックの例があります。
    • マッチメイキングとマスターサーバーの通信 -- マルチプレイヤーゲームを開発中で、Steamサーバーブラウザーを利用する場合には、ゲームサーバーはSteamのマスターサーバーと通信する必要があります。 通信方法の例は、CSpaceWarServerコンストラクターとCSpaceWarServer::SendUpdatedServerDetailsToSteam()メソッドを参照してください。
  • SpaceWarClient.cpp/h -- サンプルゲームのクライアント側のコード
    APIの使用法:
    • ロビー経由のマッチメイキング -- オンラインゲームにおいて、サーバーブラウザに追加する形、またはそれを代替として、ロビー経由でのマッチメイキングの導入をお考えかもしれません。 ロビーコードの使用とISteamMatchmakingインターフェイスを介したコールバックの例はSpaceWarClient.cpp内にあります。 また、状態と、ロビー内に入った後のコールバックの処理を行うためのコードが含まれているLobby.cpp/hも参照してください。
    • フレンドとコミュニティの統合 -- Steamでは、ゲーム内でペルソナ名や個人用のアバターを含む豊富なID情報をプレイヤーに持たせることができます。 SpaceWarClient.cpp内にISteamFriendsインターフェイスを介してペルソナ名とアバターをスコアボードに統合する例があります。
    • ネットワークAPI -- SpaceWarClient.cpp内に、SteamネットワークAPIのクライアント側の使用例があります(サーバー側の実装例は、SpaceWarServer.cppをご覧ください)。
  • StatsAndAchievements.cpp/h -- サンプルゲームのデータおよび実績の処理
    APIの使用法:
    • データ&実績 -- データおよび実績処理の実装例は、StatsAndAchievements.cppを参照してください。 ファイルには、CSpaceWarClientから更新された状態情報で呼び出されるCStatsAndAchievementsクラスが含まれます。 CStatsAndAchievementsはゲームクライアントから状態変更情報を受け取ると、ISteamUserStatsインターフェイスを通じて取得したユーザーのデータおよび実績の変更をSteamに通知します。
  • Lobby.cpp/h -- ロビー経由でのマッチメイキング
    APIの使用法:
    • ロビー経由のマッチメイキング -- ゲームのロビーベースによるマッチメイキング実装サンプルの一部は、Lobby.cppを参照してください。 Lobby.cppは、SpaceWarClient.cppと密接に連携してマッチメイキングを処理するので、両方のコードを参照してください。 ロビー用のコードを検証する際には、コールバックとISteamMatchmakingインターフェイスメソッドへの呼び出しに特に注目してください。
  • ServerBrowser.cpp/h -- ゲーム内サーバーブラウザー
    APIの使用法:
    • サーバーブラウザー経由のマッチメイキング -- サーバーブラウザー経由のマッチメイキングをサポートする場合は、Steam UIにより提供されたリストを補完するために、ゲーム内で直接サーバーブラウザーリストを提供することをおすすめします。 ゲーム用のインターネットサーバーのリストの取得、およびユーザーへの表示例は、ServerBrowser.cppを参照してください。
  • Inventory.cpp/h -- Steamインベントリサービス
    APIの使用法:

既にゲームに認証やマッチメイキング用のエンジンがあり、それらを引き続き使用する場合は、Spacewars.hからUSE_GS_AUTH_APIの定義を削除してください。 この定義を削除すると、サンプルは、Steamが提供する認証機能、またはマッチメイキングを使用しなくなりますが、実績やフレンド情報など、その他のSteam機能へはその後もアクセスできます。詳細については、ソースコードをご覧ください。