ずいぶんと日が空いてしまいましたが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; }
夜猫子 :ウェブ連載っていいね. 紙面の都合なんて考えず
ソース丸ごと乗っけちゃえるし.