ずいぶんと日が空いてしまいましたがFPS講座はじまります.

夜猫子 :というわけで前回の続きで今回は描画部分を
     クラス化してしまおうと思います.
     
ショータ:あれ?名前が変わってる

ねここ :前回の総会でバレバレだったらしいのですよー

夜猫子 :まさかいきなりばれているとは思いませんでした.
     どうやら敗因というかばれた原因はは難易度らしく.
     私が絶対やらなさそうな対話形式で進めたのになぁ.

ショータ:難易度でばれたって結構だめじゃない?

ねここ :こんな文章じゃきっと誰もわからないのですよー

ショータ:それって難易度以前の問題だよね

夜猫子 :O...TL そこまで言わなくてもいいじゃんかよぅ.
     とはいえ難易度でばれたのはたしかにまずいな.
     とりあえずはこれは講義じゃないので更新ペースは
     別と考えて,自分のペースで進めてみてください.
     あとプログラムの大半は詳しい意味がわからなくても
     「この命令の塊はこういうことが出来るんだ!」
     というところから始めても問題ないと思います.
     とりあえず書いてみて細かいところは気になってから
     後々調べるという形式でやると気が楽になると思います.
     後々ってまぁ数日先か数ヶ月先か数年先かは知りませんけど.
     特にこの章のクラス化からその傾向が強くなるので
     気楽にやってみてください.

ねここ :逃げてるだけじゃないでしょうね

夜猫子 :半分ぐらい. でも半分は本気ですのでご安心ください.

ねここ :まぁそういうことにしておくですよ

夜猫子 :では早速名前改め夜猫子のFPS講座IIIの始まり始まり〜
     今日はせっかくですので,とりあえず目先の目標として
     簡単な移動できるプログラムを作ってみました.
     あと1,2回の講座の後ならこれくらいのプログラムは
     簡単に作れるようになると思いますのでがんばってみましょう.

ねここ :とりあえず移動とかはできるみたいです

ショータ:基本中の基本だね

夜猫子 :では早速クラスとは何かから進めます.
     クラスというのは簡単に言えばひとまとめにしておいて
     都合のいい物はひとまとめにして管理してしまいましょう
     というものです.

ねここ :たとえば?

夜猫子 :たとえば何か模型をたくさん作りたかったとします.
     そのときにパーツごとに金型を作ってもいいですが,
     一つの模型の部品は一つの金型でまとめてしまった方が
     管理が楽になりますよね.
     それから金型で部品を作った後も,この金型から
     とれた部品なんだからこの模型に使う部品だ! と
     使う方ときも楽になります.
     これがクラス.

ショータ:わかりやすいような… わかりにくいような….

夜猫子 :まぁ使っているうちにだんだんわかってくると思いますので
     とりあえず書いてみましょう.
     第一章で実践あるのみっていったの誰でしたっけ?

ねここ :・・・

夜猫子 :さて,下のコードは前回書いたコードの一部です.
     このコード,主に二つの部分が入り交じっています.
     GUIアプリに必要な部分とDirectXに必要な部分です.
     DirectX系の命令にはpD3DDeviceやpD3Dなど名前に
     D3Dという文字が入っているのでわかりやすいと思います.
     というわけでコードを読んでみましょう

IDirect3D9 *pD3D = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    const int dispx = 800;
    const int dispy = 600;

	MSG msg;
    ZeroMemory(&msg, sizeof(msg));

	WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize	     = sizeof(WNDCLASSEX);
	wc.style         = CS_CLASSDC;
	wc.lpfnWndProc   = MsgProc;
	wc.hInstance     = hInstance;
	wc.lpszClassName = CLASSNAME;
    wc.hCursor       = LoadCursor(NULL , IDC_ARROW);
	
	if (RegisterClassEx(&wc)==NULL)
		PostQuitMessage(0);

    HWND hWnd = CreateWindow(CLASSNAME, APPNAME, WS_OVERLAPPEDWINDOW, 0, 0, dispx, dispy, NULL, NULL, wc.hInstance, NULL);

	if (hWnd==NULL)
		PostQuitMessage(0);

	//ウィンドウサイズ微調整
    RECT Rect;
    GetClientRect(hWnd, &Rect);
    MoveWindow(hWnd, NULL, NULL, dispx+(dispx-Rect.right), dispy+(dispy-Rect.bottom),false);

	D3DPRESENT_PARAMETERS   d3dpp;
	ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); 

	pD3D = Direct3DCreate9(D3D_SDK_VERSION);

	d3dpp.BackBufferCount        = 0;
    d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.Windowed               = true;
    d3dpp.BackBufferHeight       = dispy;
    d3dpp.BackBufferWidth        = dispx;
    d3dpp.hDeviceWindow          = hWnd;
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.BackBufferFormat		 = D3DFMT_UNKNOWN;

	pD3D->CreateDevice(D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL,
                        hWnd,
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                        &d3dpp,
                        &pD3DDevice);

    // Show the window
	ShowWindow(hWnd, SW_SHOWDEFAULT);
	UpdateWindow(hWnd);

	// Enter the message loop
	while( msg.message!=WM_QUIT ){
		if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ){
			TranslateMessage( &msg );
			DispatchMessage( &msg );
        }else{
			pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 190, 255 ), 1.0f, 0 );
			pD3DDevice->BeginScene();
			pD3DDevice->EndScene();
			pD3DDevice->Present( NULL, NULL, NULL, NULL );
        }
	}

	pD3DDevice->Release();
	pD3D->Release();

	UnregisterClass(CLASSNAME, hInstance);
    return (int)msg.wParam;

}

夜猫子 :ウェブ連載っていいね. 紙面の都合なんて考えず
     ソース丸ごと乗っけちゃえるし.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS