DirectX勉強会 第5回
x
y
z
座標、物体の位置について
(0, 50, 200)
target
player
移動する物体について
(target)
位置の管理
_TpositionX[j] : j番目のtargetx座標
_TpositionY[j] : j番目のtargety座標
_TpositionZ[j] : j番目のtargetz座標
移動 (プログラム Line468~
一回描画する度に、x座標を更新していく
_TpositionX[j] = _TpositionX[j] + 移動距離;
移動する物体について
(target)
描画 (プログラム Line446~
D3DXMatrixRotationY(&matRotateY,(float)timeGetTime() / 1800.0f);
D3DXMatrixRotationX(&matRotateX,(float)timeGetTime() / 920.0f);
D3DXMatrixTranslation(&matTrans,_TpositionX[j], _TpositionY[j],
_TpositionZ[j]);
matWorld = matRotateX * matRotateY * matTrans;
lpD3DDEV->SetTransform(D3DTS_WORLD,&matWorld);
// 使用する頂点バッファの設定
lpD3DDEV->SetStreamSource(0,vb[i],sizeof(LVERTEX));
// 描画する
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
移動する物体について
()
位置の管理
_BpositionX[j] : j番目の弾のx座標
_BpositionY[j] : j番目の弾のy座標
_BpositionZ[j] : j番目の弾のz座標
移動 (プログラム Line517~
一回描画する度に、y座標を更新していく
_BpositionY[j] = _BpositionY[j] + 移動距離;
描画 (プログラム Line500~
キー入力の処理について
プログラム全体の流れを説明
主な関数
WinMain()
procMain()
Move()
DrawMain()
主な関数
WinMain()
ウィンドウの初期化
Dinputの初期化 など
メインウィンドウループ
後処理
procMain()
キー入力はあ
るか?
Move()
キー入力によ
り、物体の座
標を変える
DrawMain()
描画する
キー入力が無い間
WinMain()
メインウィンドウループ
後処理
procMain()
キー入力はあ
るか?
Move()
キー入力によ
り、物体の座
標を変える
DrawMain()
描画する
繰り返し
ウィンドウの初期化
Dinputの初期化 など
キー入力が起こった時
WinMain()
メインウィンドウループ
後処理
procMain()
キー入力はあ
るか?
Move()
キー入力によ
り、物体の座
標を変える
DrawMain()
描画する
ウィンドウの初期化
Dinputの初期化 など
メインウインドウループ
(WinMain()の中)
PeekMessage()
メッセージが送られてきているかどうか調べる
メインウインドウループ
(WinMain()の中)
MSG msg;
while (!end)
{
// メッセージが来ているか?
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// メッセージの処理
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// 描画処理
DrawMain();
}
}
windows経由で、
procMain()を呼び
出す
DrawMain()
呼び出す
procMain()
メッセージがあると、Windowsから、この関数が呼
ばれる
msgに入っている値により、処理を決定できる
WM_CLOSE :
ウィンドウ上部の[×]ボタンを押したとき等に、この値にな
る。
アプリケーションを終了する処理をする
WM_KEYDOWN :
キーが押されたときに、この値にな
今回は、Move()を呼び出している
procMain()
LRESULT CALLBACK procMain(HWND hWnd,UINT msg,WPARAM
wParam,LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
// 終了フラグ
end = 1;
return 1;
case WM_KEYDOWN:
Move();
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
キーが押されたので、
Move()を呼び出す
Move()
DirectInputを利用して、どのキーが押された
かを判定する
押されたキーに応じて、playerの位置を動か
したり、弾を発射したりする
Move()
// キー入力を受けとって、物体の位置を移動す
int Move() {
・・・
BYTE diKeyState[256]; //この構造体にデータを取得
hr = g_pDIDevice->GetDeviceState(sizeof(BYTE)*256, &diKeyState[0]);
if (SUCCEEDED(hr)) {
//直接データの取得に成功
if (diKeyState[DIK_Q] & 0x80) {
・・・
}
else if (diKeyState[DIK_H] & 0x80) {
//h」が入力された場合は、playerが左へ移動
_PpositionX = _PpositionX - 50.0f;
}
・・・
else if (diKeyState[DIK_SPACE] & 0x80) {
・・・
}
キーqが押されたので、
終了処理をする
キーhが押されたので、
playerの位置を変える
スペースキーが押され
たので、弾を発射する
キー入力の処理について
(player)
位置の管理
_PpositionX : playerx座標
_PpositionY : playery座標
_PpositionZ : playerz座標
移動 (プログラム Line326~
押されたキーによって、x座標(左右の移動)z
(手前・奥の移動)を更新する
_PpositionX = _PpositionX “移動距離”;
_PpositionZ = _PpositionZ “移動距離”;
キー入力の処理について
(player)
描画 (プログラム Line483~
// World 行列設定
D3DXMatrixTranslation(&matTrans, _PpositionX , _PpositionY, _PpositionZ);
matWorld = matTrans;
lpD3DDEV->SetTransform(D3DTS_WORLD,&matWorld);
// 使用する頂点バッファの設定
lpD3DDEV->SetStreamSource(0,vb[i],sizeof(LVERTEX));
// 描画する
lpD3DDEV->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
実習
game.cppを改良してみる。
物体のtexture、透過度、形を変えてみる
視点を変えてみる
弾、targetの速さを変えてみる
弾の軌道を変えてみる(斜めに飛んでいく 等)
playerを移動させるキーを変えてみる
これ以外にもいろいろとあると思うので、自由に
やってみてください