Platform SDK: DirectX

ステップ 2 : 接続の初期化とセッションの列挙

[C++]

ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectPlay C/C++ チュートリアル」を参照すること。

[Visual Basic]

ユーザーが [Multiple Player] ダイアログ ボックスでサービス プロバイダとプレーヤー名を選択し、[OK] をクリックすると、Memory アプリケーションは選択された接続を初期化する。DirectPlay4.InitializeConnection は接続を DirectPlay にバインドし、以降のメソッド呼び出しがその接続に対して行われるようにする。ただし、物理接続を確立するわけではない。物理接続は、セッションが列挙されたときに確立される。

この接続上でセッションの列挙を試みると、サービス プロバイダによっては (モデム サービス プロバイダなど)、物理接続を確立するための追加情報を要求するダイアログ ボックスが表示される場合がある。ユーザーは、既存のゲームに参加するのではなく、新しいゲームを作成する場合は、これらのダイアログ ボックスをキャンセルすることができる。

Memory では、ユーザーが既存のセッションを表示するつもりがなく、新しいセッションを直接作成したい場合でも、セッションが列挙される。実際のアプリケーションでは、この動作を変更し、ユーザーが既存のセッションのリストを要求した場合以外は、DirectPlay4.GetDPEnumSessions を呼び出さないようにしてもよい。このメソッドを呼び出さないと、場合によってはユーザーに対する処理を簡素化することができる。たとえば、モデム サービス プロバイダには、2 つの異なるダイアログ ボックスがある。1 つはダイヤル用で、もう 1 つは応答用である。新しいゲームを作成するプレーヤーには、ダイヤル用のプロンプトは不要である。これは、モデム ゲームのホストは、常にほかのプレーヤーからの呼び出しを待機するものだからである。セッションの列挙を省略して DirectPlay4.Open を呼び出すと、ホストにダイヤル用のプロンプトが表示されなくなる。

frmMultiplayer 内の以下のプロシージャは、選択された接続を初期化して、次のダイアログ ボックスに表示されるリスト ボックスに利用可能なセッションを代入する。

Private Sub cmdOK_Click()
 
  Dim CIndex As Long
  Dim ConnectionMade As Boolean
  Dim objDPAddress As DirectPlayAddress
 
  CIndex = lstConnections.ListIndex + 1

列挙されたコレクションは 1 から始まるが、リスト ボックス内のリストは 0 から始まる。そのため、コレクションのインデックスを調整する必要がある。

ここで、アプリケーションは接続の DirectPlay アドレスを取得し、それを初期化する。
  On Error GoTo INITIALIZEFAILED
  Set objDPAddress = gObjEnumConnections.GetAddress(CIndex)
  Call gObjDPlay.InitializeConnection(objDPAddress)
  On Error GoTo 0
  

次の呼び出しについては、後で詳しく説明する。

  ConnectionMade = frmSessions.UpdateSessionList

フォームが閉じ、新しいフォームが表示される。このフォームには、セッションのリストと、セッションへの参加または作成を許可するボタンが表示されている。

  If ConnectionMade Then
    Hide
    frmSessions.Show
  Else
    InitDPlay
  End If
  Exit Sub 
  ' エラー ハンドラ。
 
INITIALIZEFAILED:
  If Err.Number <> DPERR_ALREADYINITIALIZED Then
    MsgBox ("Failed to initialize connection.")
    Exit Sub
  End If
  
End Sub

セッションの列挙は以下の関数で実行する。この関数は、新しいセッションが利用可能になったり、古いセッションが削除されたときに、セッションのリストを更新するためにも利用される。

Public Function UpdateSessionList() As Boolean
  
  Dim SessionCount As Integer
  Dim X As Integer
  Dim SessionData As DirectPlaySessionData
  Dim Details As String
  
  ' 古いリストを削除する。
  lstSessions.Clear
  
  Set SessionData = gObjDPlay.CreateSessionData
  

DirectPlaySessionData オブジェクトは、列挙するセッションを記述する。Memory では、ほかのアプリケーションのセッションを利用しないので、独自に定義したアプリケーション GUID を (文字列の形式で) 指定する。特定のパスワードを備えるセッションだけを列挙できるようにする場合は、ここでセッション記述にパスワードも設定する。

  Call SessionData.SetGuidApplication(AppGuid)
  Call SessionData.SetSessionPassword("")
  

DirectPlay4.GetDPEnumSessions を呼び出すと、利用可能なセッションだけが必要であるということが指定される。これには、プレーヤーの最大人数に達していなければ参加できないセッションは含まれない。

  On Error GoTo USERCANCEL
  Set gObjDPEnumSessions = gObjDPlay.GetDPEnumSessions(SessionData, _
          0, DPENUMSESSIONS_AVAILABLE)
  On Error GoTo 0

このメソッドは、ユーザーがサービス プロバイダのダイアログ ボックスをキャンセルした場合には失敗する。その場合、アプリケーションでは、プレーヤーが新しいセッションを作成しようとしていると想定する。したがって、これを致命的なエラーとは見なさない。

列挙に成功すると、アプリケーションは DirectPlayEnumSessions オブジェクトを使用して、各セッションに関する情報を取得する。これには、セッションの名前、現在のプレーヤー数、最大プレーヤー数などが含まれる。これらの情報を組み合わせて文字列を作成し、その文字列をリスト ボックスに表示する。

  On Error GoTo ENUM_ERROR
  SessionCount = gObjDPEnumSessions.GetCount
  For X = 1 To SessionCount
    Set SessionData = gObjDPEnumSessions.GetItem(X)
    Details = SessionData.GetSessionName & " (" _
            & SessionData.GetCurrentPlayers _
            & "/" & SessionData.GetMaxPlayers & ")"
    Call lstSessions.AddItem(Details)
  Next X

ここでは省略するが、この関数の以降の部分では、インターフェイスを更新し、エラーを処理する。

次項 : ステップ 3 : セッションの作成またはセッションへの参加