DIRECTX1 DirectPlay1 準備 + 初期化

通信対戦に便利なDirectPlayについて説明します。

DirectPlayは、DirectXの一部で、DirectDrawなどと同じくCOMとして実装されています。ですから初期化などの処理はDirectDrawや、DirectSoundと同じなのでもう戸惑うことも無いとおもいます。

ですが、一応、準備として基本的な事を押さえておきましょう。

DirectPlayのテストをしますが、のちのちまで使えるようにここでもクラスとして作ります。市販の書籍などではSDKベースのプログラムになっているのが普通ですが、ここではSDIベースでプログラミングしている都合もあり、これもMFCを使ったSDIベースのプロジェクトを使用します。プロジェクトの設定のステップ6/6の基本クラスはCFormViewにしてください。
プロジェクト作成後の準備は以下の通り。

1 SDIプロジェクトを作る。設定は特に指定が無いが、これはテスト用なので、実際にゲームを作るときには必要な設定をすること。
2 DirectPlayのクラスを作成する。名前はCDxPlayとする。
3 削除
4 プロジェクト>>設定>>リンク のオブジェクト/ライブラリモジュール に  dplay.lib dxguid.lib を書き込む。
5 ボタンを一つと、リストボックスを一つ置く。リストボックスは、クラスウィザードでメンバ変数を追加しておく。カテゴリはコントロール、名前は何でも良いが、説明の都合上、m_List1とする。
6 Viewクラスに「#include "dxplay.h"」をインクルードする。
7 Viewクラスのインプリメンテーションに  CDxPlay dxp; として、DxPlayクラスのオブジェクトを作成する。
8 Viewクラスに #include "dplay.h" をインクルードする。
9 CDxPlayクラスのヘッダファイルに  #include "dplay.h" をインクルードする。
10 CDxPlayクラスのグローバルの位置にDirectPlayのオブジェクトを作成する。以下のように書く。これはCDxPlayクラス、DxPlay.cppの頭の部分。
 

// DxPlay.cpp: CDxPlay クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////
 
#include "stdafx.h"
#include "dxptest.h"
#include "DxPlay.h"
 
//#include "dplay.h"
 
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
 
LPDIRECTPLAY4A lpDP4A;
 

例によって一度ビルドしてエラーの無いことを確認してください。

外観の完成予想図(初期化したところ)


ではまず、Dplayの初期化を行います。Viewクラスに  #include "dxplay.h" をインクルードした後、DxPlayクラスに「InitDplay」という関数を追加します。中身は以下の通り。
 

HRESULT CDxPlay::DxInitDplay()
{
 
HRESULT ret;
//---------------------------------------
// Comの初期化
CoInitialize(NULL);
ret = CoCreateInstance( CLSID_DirectPlay,
 NULL,
 CLSCTX_INPROC_SERVER,
 IID_IDirectPlay4A,
 (LPVOID*)&lpDP4A);
 
if(ret != DP_OK){
 AfxMessageBox("初期化に失敗しました");
 lpDP4A->Release();
 return FALSE;
}
 
return DP_OK;
}
 

関次に作成したDPlayオブジェクトの消滅用の処理も書いておきましょう。DxPlayクラスのデストラクタに以下のコードを追加します。
 

CDxPlay::~CDxPlay()
{
 if(lpDP4A != NULL)
  lpDP4A->Release();

}
 
Button1を押して、初期化が成功したかどうか確認しましょう。Button1のコードは以下の通り。
 
void CDxptestView::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 
HRESULT ret = dxp.DxInitDplay();
if(ret != DP_OK){
 AfxMessageBox("DirectPlayの初期化に失敗しました");
 return;
}

 
AfxMessageBox("DirectPlayの初期化に成功しました");
}
 

「初期化に成功した」というダイアログが出たら初期化はOKです。