- 追加された行はこの色です。
- 削除された行はこの色です。
ずいぶんと日が空いてしまいましたがFPS講座はじまります.
test
夜猫子 :というわけで前回の続きで今回は描画部分を
クラス化してしまおうと思います.
ショータ:あれ?名前が変わってる
ねここ :前回の総会でバレバレだったらしいのですよー
夜猫子 :まさかいきなりばれているとは思いませんでした.
どうやら敗因というかばれた原因はは難易度らしく.
私が絶対やらなさそうな対話形式で進めたのになぁ.
ショータ:難易度でばれたって結構だめじゃない?
ねここ :こんな文章じゃきっと誰もわからないのですよー
ショータ:それって難易度以前の問題だよね
夜猫子 :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;
}
夜猫子 :ウェブ連載っていいね. 紙面の都合なんて考えず
ソース丸ごと乗っけちゃえるし.