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 関数は次の処理を実行する。
- CoInitialize を使ってコンポーネント オブジェクト モデル (COM) を初期化する。
- CoCreateInstance を使って IDirectPlay8Peer オブジェクトを作成する。
- CoCreateInstance を使って IDirectPlay8LobbiedApplication オブジェクトを作成する。
- IDirectPlay8Peer::Initialize を呼び出し、メッセージ ハンドラを渡す。
- IDirectPlay8LobbiedApplication::Initialize を呼び出し、メッセージ ハンドラを渡す。
- IDirectPlay8LobbiedApplication::Initialize メソッドの戻り値を確認する。処理に成功した場合、アプリケーションはロビー クライアントにより起動される。
アプリケーションがロビー クライアントにより起動された場合、接続設定は CNetConnectWizard の ConnectUsingLobbySetting 関数により、ロビー クライアントから取得できる。CNetConnectWizard クラスは、ヘルパー クラスである。このクラスはダイアログ ボックスを使って、ユーザーに情報を問い合わせる。ConnectUsingLobbySettings 関数は次の処理を実行する。
- IDirectPlay8LobbiedApplication::GetConnectionSettings を呼び出して、クライアントから接続設定を取得する。
- DPL_CONNECTION_SETTINGS 構造体の dwFlags メンバで DPLCONNECTIONSETTINGS_HOST フラグをチェックし、ホストとなる必要があるかどうかを確認する。
- IDirectPlay8Peer::SetPeerInfo を呼び出す。
- ホストとなる場合は IDirectPlay8Peer::Host を呼び出し、そうでない場合は IDirectPlay8Peer::Connect を呼び出す。
- DPL_CONNECTION_SETTINGS のオブジェクトを解放する。
ロビー クライアントから接続設定が提供されない場合、アプリケーションは CNetConnectWizard の DoConnectWizard 関数を呼び出す。DoConnectWizard は、次の処理を実行する。
- IDirectPlay8Peer::EnumServiceProviders を呼び出して、サービス プロバイダを列挙する。
- ConnectionDlgOnOk 関数を呼び出す。この関数はダイアログ ボックスを表示し、ユーザーがサービス プロバイダを選択するか、ロビー接続の使用を選択できるようにする。[Wait for lobby connection] が選択された場合は、IDirectPlay8LobbiedApplication::SetAppAvailable を呼び出して、アプリケーションに接続して利用可能であることをロビー クライアントに伝える。サービス プロバイダが選択された場合は、CoCreateInstance を呼び出して DirectPlay ホストとデバイス アドレス オブジェクトを作成する。次に、IDirectPlay8Address::SetSP を呼び出して、サービス プロバイダのグローバル一意識別子 (GUID) を 2 つの DirectPlay アドレス オブジェクトに渡す。
- IDirectPlay8Peer::EnumHosts を呼び出して、そのサービス プロバイダで進行中のすべてのゲームを列挙する。
- コールバック関数に送信する 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] をクリックすると、すべてのインターフェイスが消去される。