Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectPlay C/C++ チュートリアル」を参照すること。
ユーザーが [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
ここでは省略するが、この関数の以降の部分では、インターフェイスを更新し、エラーを処理する。