- 追加された行はこの色です。
- 削除された行はこの色です。
今回は、22回までのまとめとなります
簡易ですが2Dゲームに必要最低限な要素はこれまでの講座で一通り実装できたと思うのでまとめてみます
今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
今までのまとめなので多いです
・&ref(direct3d.h);
・&ref(direct3d.cpp);
・&ref(texture.h);
・&ref(texture.cpp);
・&ref(sprite.h);
・&ref(sprite.cpp);
・&ref(font.h);
・&ref(font.cpp);
・&ref(directsound.h);
・&ref(directsound.cpp);
・&ref(wave.h);
・&ref(wave.cpp);
・&ref(soundbuffer.h);
・&ref(soundbuffer.cpp);
・&ref(directx.h);
・&ref(directx.cpp);
・&ref(winmain.cpp);
zipでほしい人はこちら
・&ref(gameframework.zip);
今回のポイントはWinMain側で今までDirectXの初期化と処理をしてきたのですが
これだとウィンドウ作成などの変更がない処理部分の処理も混じって見づらいと思うので
DirectXクラスを作り、初期化とメッセージループでの処理をメンバ関数で行うことでDirectXの処理を見やすくします
directx.hは次のようになります
#pragma once
// 作ったヘッダーファイルを全部インクルード
#include "direct3d.h"
#include "texture.h"
#include "sprite.h"
#include "font.h"
#include "directsound.h"
#include "wave.h"
#include "soundbuffer.h"
class DirectX
{
public:
// DirectX関係のメンバ変数
Direct3D direct3d;
DirectSound directsound;
// コンストラクタ
DirectX();
// デストラクタ
~DirectX();
// 各メンバ変数の初期化
void Init(HWND hWnd,int Width,int Height);
// メインループ
void MainLoop();
};
directx.cppは次のようになります
#include "directx.h"
// コンストラクタ
DirectX::DirectX()
{}
// デストラクタ
DirectX::~DirectX()
{}
// 各メンバ変数の初期化
void DirectX::Init(HWND hWnd,int Width,int Height)
{
// Direct3D作成
direct3d.Create(hWnd,Width,Height);
// DirectSound作成
directsound.Create(hWnd);
}
// メインループ
void DirectX::MainLoop()
{
// 描画開始
if(SUCCEEDED(direct3d.pDevice3D->BeginScene()))
{
DWORD ClearColor = 0xff808080; // 背景クリア色
// 背景クリア
direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 );
// 描画終了
direct3d.pDevice3D->EndScene();
}
// 描画反映
direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL );
}
winmain.cpp側でInitメンバ関数とMainLoopメンバ関数を呼び出します
#include <Windows.h>
#include <tchar.h>
#include "directx.h"
// ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
// ウィンドウが破棄されたとき
case WM_DESTROY:
PostQuitMessage(0); // WM_QUITメッセージをメッセージキューに送る
return 0;
}
// デフォルトのメッセージ処理を行う
return DefWindowProc(hWnd, msg, wParam, lParam);
}
// WinMain関数(アプリケーションの開始関数)
// コンソールアプリケーションと違い、コンソールを開かない
int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
const TCHAR* WC_BASIC = _T("BASIC_WINDOW");
// シンプルウィンドウクラス設定
WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,WndProc, 0,0,hInstance,
(HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED),
(HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED),
(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL};
// シンプルウィンドウクラス作成
if(!RegisterClassEx(&wcex))
return false;
// ウィンドウ幅、高さはディスプレイに依存する。普通は4:3
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 480;
// ウィンドウの作成
HWND hWnd = CreateWindowEx(0,WC_BASIC,
_T("Application"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);
// DirectX作成
DirectX directx;
directx.Init(hWnd,WINDOW_WIDTH,WINDOW_HEIGHT);
// メッセージループ
MSG msg = {};
while(msg.message != WM_QUIT) {
// アプリケーションに送られてくるメッセージをメッセージキューから取得する
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
DispatchMessage(&msg); // アプリケーションの各ウィンドウプロシージャにメッセージを転送する
}
// メッセージ処理をしていないとき
else{
//(ここにDirectXの処理を書く)
directx.MainLoop();
}
}
return 0;
}
このようにしておけば、
ゲームを作るときはDirectXクラスのInitメンバ関数とMainLoopメンバ関数をいじればよいことになります
初期化までの処理しかしていないので実行結果は省略します
ゲーム本体自体はゲームによって様々なので各個人が作りたいゲームによって実装が異なると思います
しかし、2Dゲームの作成はこの簡易2Dゲームフレームワークをベースにすることで作成しやすいと思います
前:DirectX講座22回
#vote( ヴェイ!![7],これから毎日プログラム書こうぜ![6],よくもこんなキチガイ(プログラム)コードを![19],終わらせたなコイツ![117]);
| ヴェイ!!|11|
|これから毎日プログラム書こうぜ!|14|
|よくもこんなキチガイ(プログラム)コードを!|22|
|終わらせたなコイツ![|138|