次の方法で共有


SimplePeer

SimplePeer

サンプル SimplePeer は、簡単なピアツーピア アプリケーションの実装方法を示す。セッションに参加するか、またはセッションを作成すると、すぐにゲームが開始する。セッションには、他のプレーヤもいつでも参加できる。

パス

ソース ファイル : (SDK ルート)\Samples\C++\DirectPlay\SimplePeer

実行可能ファイル :(SDK ルート)\Samples\C++\DirectPlay\Bin

ユーザーズ ガイド

プレーヤの名前を入力し、接続の種類を選択する。[Wait for lobby connection] またはサービス プロバイダを選択できる。[Multiplayer Games] ダイアログ ボックスを使って、参加するアクティブなゲームの検索または新しいゲームの開始ができる。ゲームに参加するか、ゲームを作成すると、すぐにゲームが開始する。他のプレーヤは、いつでもゲームに参加できる。ホストの移行が有効になっている場合、Microsoft® DirectPlay® が自動的にホスト セッションを他のプレーヤに移行するため、ホスト プレーヤはいつでもゲームを抜けられる。

  Internetwork Packet Exchange (IPX) サービス プロバイダを選んだ場合、DirectPlay にアドレスの検索を実行させるには、[use DPNSVR] チェック ボックスをオンにする。

プログラミング上の注意

InitDirectPlay 関数は次の処理を実行する。

  1. CoInitialize を使ってコンポーネント オブジェクト モデル (COM) を初期化する。
  2. CoCreateInstance を使って IDirectPlay8Peer オブジェクトを作成する。
  3. CoCreateInstance を使って IDirectPlay8LobbiedApplication オブジェクトを作成する。
  4. IDirectPlay8Peer::Initialize を呼び出し、メッセージ ハンドラを渡す。
  5. IDirectPlay8LobbiedApplication::Initialize を呼び出し、メッセージ ハンドラを渡す。
  6. IDirectPlay8LobbiedApplication::Initialize メソッドの戻り値を確認する。処理に成功した場合、アプリケーションはロビー クライアントにより起動される。

アプリケーションがロビー クライアントにより起動された場合、接続設定は CNetConnectWizard の ConnectUsingLobbySetting 関数により、ロビー クライアントから取得できる。CNetConnectWizard クラスは、ヘルパー クラスである。このクラスはダイアログ ボックスを使って、ユーザーに情報を問い合わせる。ConnectUsingLobbySettings 関数は次の処理を実行する。

  1. IDirectPlay8LobbiedApplication::GetConnectionSettings を呼び出して、クライアントから接続設定を取得する。
  2. DPL_CONNECTION_SETTINGS 構造体の dwFlags メンバで DPLCONNECTIONSETTINGS_HOST フラグをチェックし、ホストとなる必要があるかどうかを確認する。
  3. IDirectPlay8Peer::SetPeerInfo を呼び出す。
  4. ホストとなる場合は IDirectPlay8Peer::Host を呼び出し、そうでない場合は IDirectPlay8Peer::Connect を呼び出す。
  5. DPL_CONNECTION_SETTINGS のオブジェクトを解放する。

ロビー クライアントから接続設定が提供されない場合、アプリケーションは CNetConnectWizard の DoConnectWizard 関数を呼び出す。DoConnectWizard は、次の処理を実行する。

  1. IDirectPlay8Peer::EnumServiceProviders を呼び出して、サービス プロバイダを列挙する。
  2. ConnectionDlgOnOk 関数を呼び出す。この関数はダイアログ ボックスを表示し、ユーザーがサービス プロバイダを選択するか、ロビー接続の使用を選択できるようにする。[Wait for lobby connection] が選択された場合は、IDirectPlay8LobbiedApplication::SetAppAvailable を呼び出して、アプリケーションに接続して利用可能であることをロビー クライアントに伝える。サービス プロバイダが選択された場合は、CoCreateInstance を呼び出して DirectPlay ホストとデバイス アドレス オブジェクトを作成する。次に、IDirectPlay8Address::SetSP を呼び出して、サービス プロバイダのグローバル一意識別子 (GUID) を 2 つの DirectPlay アドレス オブジェクトに渡す。
  3. IDirectPlay8Peer::EnumHosts を呼び出して、そのサービス プロバイダで進行中のすべてのゲームを列挙する。
  4. コールバック関数に送信する DPN_MSGID_ENUM_HOSTS_RESPONSE を処理する。

ウィザードに現在のセッションの一覧が表示され、ユーザーが一覧からゲームを選択するか、新しいゲームを選択できるようになる。[Join] をクリックすると、SessionDlgJoinGame 関数は IDirectPlay8Peer::SetPeerInfo を呼び出して、プレーヤ名と IDirectPlay8Peer::Connect を設定してゲームに接続する。[Create] をクリックすると、SessionDlgCreateGame 関数は IDirectPlay8Peer::SetPeerInfo を呼び出してプレーヤ名を設定し、IDirectPlay8Peer::Host を呼び出してゲームのホスティングを開始する。ゲーム名、最大プレーヤ数、アプリケーションの GUID などの情報が格納された DPN_APPLICATION_DESC 構造体は、Connect の呼び出しで渡される。

接続後、[Wave to other players] をクリックすると、WaveToAllPlayers 関数は DPNID_ALL_PLAYERS_GROUP を設定した dpnid パラメータと、GAME_MSGID_WAVE が含まれた DWORD を示す pBufferDesc パラメータを使って、IDirectPlay8Peer::SendTo を呼び出す。

[Exit] をクリックすると、すべてのインターフェイスが消去される。