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です。