Platform SDK: DirectX

ステップ 2 : 接続設定の取得

このステップでは、アプリケーションで 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 : セッションへの参加