Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。
DirectX バージョン 3.0 以降の DirectPlay の DLL の名前は、それ以前のバージョンのものとは異なる。Applications compiled with DirectX 2.0 以前と互換性があるアプリケーションは、DirectPlay の新しい DLL を使用しない。これらの新しい DLL を使用するには、アプリケーションを再コンパイルして、インポート ライブラリ Dplayx.lib にリンクしなければならない。
また、アプリケーションをロビーに対応させるためのコードも追加すべきである。これにより、外部ロビーまたは仲介プログラムがアプリケーションを開始し、セッションに接続するために必要な情報をすべて提供できるようになる。アプリケーションでは、サービス プロバイダを決めたり、セッションを選択したり、その他の情報 (電話番号、ネットワーク アドレスなど) を提供したりするように、ユーザーに要求する必要はない。
さらに、DirectX バージョン 6.0 では、ほかにも新しい機能がいくつか追加された。これらの新機能には、以下のようなものがある。
DirectPlay バージョン 2.0 以前で作成されたアプリケーションを移行させるには、次のステップを実行する。
アプリケーションがロビー クライアントから起動されていたかどうかを確認する。詳細については、「ステップ 2 : 接続設定の取得」を参照すること。
アプリケーションがサービス プロバイダを列挙している場合は、DirectPlay4::EnumConnections メソッドを使用して、サービス プロバイダが利用可能かどうかを判断する。利用可能な場合は、そのサービス プロバイダに対して DirectPlay4::InitializeConnection メソッドを呼び出す。InitializeConnection がエラーを返す場合、サービス プロバイダをシステム上で実行することはできないので、そのサービス プロバイダをユーザーに表示するリストに追加すべきではない。呼び出しが成功した場合は、Release メソッドを使用して DirectPlay オブジェクトを解放し、そのサービス プロバイダをリストに追加する。
IDirectPlay インターフェイス上の QueryInterface メソッドを呼び出し、IDirectPlay4 (Unicode) または IDirectPlay4A (ANSI) インターフェイスを取得する。2 つのインターフェイスの違いは、構造体内の文字列を読み書きする方法だけである。Unicode インターフェイスの場合は、構造体の LPWSTR 型のメンバに Unicode 文字列が読み書きされる。ANSI インターフェイスの場合は、構造体の LPSTR 型のメンバに ANSI 文字列が読み書きされる。
既存の API で新しい構造体を使用するために必要な変更をすべて加える。たとえば、次のようなコードがあるとする。
lpDP->SetPlayerName(pidPlayer, lpszFriendlyName, lpszFormalName)
lpDP は、IDirectPlay インターフェイスである。この場合は、次のようなコードを使用する。
DPNAME PlayerName, *lpPlayerName PlayerName.dwSize = sizeof(DPNAME) lpPlayerName = &PlayerName lpPlayerName->lpszShortNameA = lpszFriendlyName lpPlayerName->lpszLongNameA = lpszFormalName lpDP4A->SetPlayerName(pidPlayer, lpPlayerName, 0)
lpDP4A は、IDirectPlay4A インターフェイスである。このアプリケーションで Unicode 文字列を使用している場合 (したがって、IDirectPlay4 インターフェイスのインスタンスを作成する場合) は、次のようなコードを使用する。
lpPlayerName->lpszShortName = lpwszFriendlyName lpPlayerName->lpszLongName = lpwszFormalName lpDP4->SetPlayerName(pidPlayer, lpPlayerName, 0)
lpDP4 は、IDirectPlay4 インターフェイスである。
以下のシステム メッセージを更新する。
DPSYS_ADDPLAYER は、DPSYS_CREATEPLAYERORGROUP に置き換えられた。
DPSYS_DELETEPLAYER と DPSYS_DELETEGROUP は、単一の DPSYS_DESTROYPLAYERORGROUP メッセージに統一された。
DPSYS_DELETEPLAYERFROMGRP は、DPSYS_DELETEPLAYERFROMGROUP に変更された。
アプリケーションを更新し、プレーヤーまたはグループの名前が変更されたときに DPSYS_SETPLAYERORGROUPNAME メッセージを生成し、プレーヤーまたはグループのデータが変更されたときに DPSYS_SETPLAYERORGROUPDATA メッセージを生成するようにする。
DPSESSIONDESC 構造体を DPSESSIONDESC2 に更新し、DPCAPS 構造体に新しいメンバを追加する。
IDirectPlay4::EnumSessions、IDirectPlay4::EnumGroups、IDirectPlay4::EnumGroupPlayers、および IDirectPlay4::EnumPlayers に対するコールバック関数を更新する。
hEvent パラメータを IDirectPlay4::CreatePlayer メソッドに渡す方法を更新する。DirectPlay の以前のバージョンでは、このパラメータは lpEvent だった。DirectPlay はイベントを返さないので、アプリケーションでそれを作成する必要がある。これにより、アプリケーションでは、すべてのプレーヤーに対して 1 つのイベントを作成するという柔軟性が得られる。
プレーヤーがゲームから不適切な方法で退出したことを DirectPlay によって検出したい場合は、DPSESSIONDESC2 構造体の DPSESSION_KEEPALIVE フラグを設定する。
アプリケーションを更新し、DPSESSION_MIGRATEHOST フラグを設定してセッションを作成するようにする。これにより、現在のホストがセッションを退出したときに、別のコンピュータがホストになることが可能になる。ホストだけが実行する特別なコードがアプリケーションにある場合は、アプリケーションでセッションを作成するときに、このフラグを設定する必要がある。または、DPSYS_HOST システム メッセージに対するサポートも追加すべきである。システム メッセージの一覧については、「システム メッセージの使用」を参照すること。
IDirectPlay4 インターフェイスの新しいメソッドに慣れ、それらをアプリケーションで使用する。プレーヤーの状態に関する情報をほかのすべてのプレーヤーにブロードキャストするコードは、IDirectPlay4::SendEx メソッドと IDirectPlay4::Receive メソッドを使用して置き換えられる場合がある。