ずいぶんと日が空いてしまいましたが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