Microsoft DirectX 8.0 (C++)

ピアツーピア ゲームの通常のプレー

Microsoft® DirectPlay® のメッセージは、基本的には、セッション内のメンバに送信されるゲーム関連のデータ ブロックである。DirectPlay は、データ ブロックの内容や形式を限定せずに、ユーザーどうしがデータをやり取りするためのメカニズムのみを提供する。ゲームの進行中には、通常、各セッション メンバから残りのセッション メンバ全員に対して、メッセージが間断なく送信される。これらのメッセージの主な目的は、各ユーザーのアプリケーションに同じ UI を表示するために、ゲームの状態の同期をとることにある。ただし、メッセージは、これに限らずゲーム固有の多様な目的に使用できる。

ゲーム (特に変化の速いゲーム) では、メッセージングを慎重に管理しなければならない場合が多い。DirectPlay は、流出するメッセージを、ターゲットが処理できるレベルに減速 (スロットリング) する。重要なメッセージを確実に届けるため、メッセージをあまり高速で送信しないように注意しなければならない。DirectPlay での効率的なメッセージング処理については、「ネットワーキングの基本」を参照すること。

ほかのセッション メンバにメッセージを送信するには、IDirectPlay8Peer::SendTo を呼び出す。そのメンバに、データが付いた DPN_MSGID_RECEIVE メッセージが届く。特定のプレーヤーにメッセージを送信するには、関連する DPN_MSGID_CREATE_PLAYER メッセージと共に受け取ったプレーヤー ID を、dpnid パラメータに設定する。また、dpnid を DPNID_ALL_PLAYERS_GROUP に設定すれば、セッション内のプレーヤー全員にメッセージを送信できる。プレーヤーのグループを定義すると、SendTo を 1 回呼び出すだけで、グループのメンバ全員にメッセージを送信できる。

  ほかのユーザーに情報を送信するには、IDirectPlay8Peer::SetPeerInfo メソッドを使用してもよい。それらのユーザーに、その情報が付いた DPN_MSGID_PEER_INFO メッセージが届く。ただし、この送信方法はあまり効率的でないので、通常のメッセージングでは使用しないこと。

グループの使用

多くのゲームは、プレーヤーをグループ分けできるようになっている。たとえば戦略型ゲームでは、通常、プレーヤーを複数のグループに分け、グループ単位で指示を出すことができる。Microsoft® DirectPlay® でも、プレーヤーのグループを編成できる。DirectPlay のグループは、基本的にはメッセージングを簡略化する手段である。グループを定義すると、IDirectPlay8Peer::SendTo を 1 回呼び出すだけで、グループ メンバ全員にメッセージを送信できるようになる。DirectPlay のグループは、通常はゲームで定義されるグループに対応するが、グループ作成の目的が限定されているわけではない。

DirectPlay のグループを作成するには、IDirectPlay8Peer::CreateGroup を呼び出す。この結果、セッション メンバ全員に、詳細が付いた DPN_MSGID_CREATE_GROUP メッセージが届く。このメッセージには、グループにメッセージを送信するために使用するグループ ID が含まれる。

グループを作成したら、次に IDirectPlay8Peer::AddPlayerToGroup を呼び出してプレーヤーを追加する。この結果、セッション メンバに、新しくプレーヤーが追加されたグループの ID が付いた DPN_MSGID_ADD_PLAYER_TO_GROUP メッセージが届く。

グループを確立すると、そのグループにデータを送信できるようになる。これには、dpnid パラメータにグループ ID を設定して IDirectPlay8Peer::SendTo を呼び出す。この結果、グループ メンバ全員に、データが付いた DPN_MSGID_RECEIVE メッセージが届く。

グループからプレーヤーを削除するには、IDirectPlay8Peer::RemovePlayerFromGroup を呼び出す。セッション メンバに、プレーヤーの ID が付いた DPN_MSGID_DESTROY_PLAYER メッセージが届く。

最後に、グループを使い終わったら、IDirectPlay8Peer::DestroyGroup を呼び出せば破棄できる。この結果、セッション メンバ全員に、グループ ID が付いたDPN_MSGID_DESTROY_GROUP メッセージが届く。