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