Platform SDK: DirectX |
このステップでは、アプリケーションで DirectPlay を初期化し、アプリケーションがロビーによって開始されているかどうかを判断する。ロビーによって開始されている場合は、直ちに接続設定を取得する。そうでない場合は、接続設定を待機する。
最初に、DirectPlayLobby3 オブジェクトを作成する。それには、初期化された DirectX7 オブジェクトの objDX を使用する。
Public Function InitDPlay() As Boolean InitDPlay = True On Local Error GoTo FAILED Set objDPLobby = objDX.DirectPlayLobbyCreate
次に、DirectPlayLobby3.GetConnectionSettings を呼び出す。アプリケーションが、ロビー クライアント内での DirectPlayLobby3.RunApplication の呼び出しに応答して開始されている場合、GetConnectionSettings は成功する。そうでない場合は、DPERR_NOTLOBBIED が返される。
On Local Error Resume Next Set objDPLConnection = objDPLobby.GetConnectionSettings(0) ' アプリケーションはロビーによって開始された。 If Err.Number = 0 Then GoTo GOTCONNECTION
アプリケーションがロビーによって起動されていない場合は、この時点でユーザーに対して、シングルプレーヤー ゲームを開始するか、内部ロビー クライアントを介してセッションに接続するかを選択させることもできる。サンプル アプリケーションでは、ロビー接続を待機する方法を採用している。まず、DirectPlayLobby3.WaitForConnectionSettings. を呼び出して、待機モードに入る。これにより、ユーザーがロビー クライアントでアプリケーション セッションを作成したり、またはアプリケーション セッションに参加したりしたときに、RunApplication によってアプリケーションの別のインスタンスが実行されなくなる。代わりに、このインスタンスで接続設定を利用できるようになる。
On Local Error GoTo FAILED Call objDPLobby.WaitForConnectionSettings(DPLWAIT_DEFAULT)
ここで、サンプル アプリケーションはダイアログ ボックスを表示する。このダイアログ ボックスは、接続が確立されるか、またはユーザーがキャンセルするまで、アクティブなままになっている。
frmWaiting.Show Call WaitForConnectionMessage
アプリケーションが実際に待機するのは、この部分である。WaitForConnectionMessage 関数は、ロビーから DPLSYS_NEWCONNECTIONSETTINGS メッセージを受信するか、またはユーザーがキャンセルするまで、ブロックする。
Public Sub WaitForConnectionMessage() Dim msg As DirectPlayMessage Dim flags As Long Dim MsgType As Long On Local Error Resume Next gGotConnection = False Do While DoEvents Set msg = objDPLobby.ReceiveLobbyMessage(0, flags) If Not (msg Is Nothing) Then MsgType = msg.ReadLong If MsgType = DPLSYS_NEWCONNECTIONSETTINGS Then gGotConnection = True Exit Do End If End If Loop Exit Sub End Sub
サンプル アプリケーションでは、ユーザーがダイアログ ボックスをキャンセルすると、FALSE が返される。これは、可視状態のフォームがほかに存在せず、DoEvents が FALSE を返すからである。可視状態のフォームがほかに存在するアプリケーションでは、ほかの方法を使用して、ユーザーがキャンセルを選択したときにループを抜ける必要がある。
呼び出し側のプロシージャでは、DPLSYS_NEWCONNECTIONSETTINGS を受け取ると、状態のダイアログ ボックスを閉じて、DirectPlayLobbyConnection オブジェクトを取得する。
If gGotConnection Then frmWaiting.Hide Set objDPLConnection = objDPLobby.GetConnectionSettings(0) Else GoTo FAILED ' ユーザーがキャンセルした。 End If
次項 : ステップ 3 : セッションへの参加