以下のコードはウインドウの中に画像を描画し、それを動かすという内容です。
環境はWindows7、VisualC++Express、DirectX9になります。
226行目から、キーボードからの直接データを取得して画像を右に動かす関数を記述をしているのですが、
キーボードを押しても反応がありません。
228行目の画像を移動させる記述は有効なため、問題はキーボードの情報を取得できていないということだと思うのですが、
何が問題なのか見当がつきません。
いくつかのサイトを調べたところ、下記のようにキーボードの状態の取得をキーの取得の前に記述するという方法を見つけ実践してみましたが、いずれもエラーが起きてしまいました。
//画像の移動//これでプレイヤー画像を動かす
HRESULT idou()
{
//テストその1
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
HRESULT hr;
hr = g_pDIDevice->GetDeviceState(256,diKeyState);
if(SUCCEEDED(hr))
{
}
else if(hr==DIERR_INPUTLOST)
g_pDIDevice->Acquire();
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
//m_vec2.x += 1.0f;//この記述は有効
//テストその2
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
if( (hr==DI_OK)||(hr==S_FALSE) )//エラーが起きる
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
if(diKeyState[DIK_G] & 0x80)//Gボタンを押したら画像が右に動く
{
m_vec2.x += 1.0f;
}
}
return S_OK;
}
ここからが本コードになります。
何か知恵をお借りできれば幸いです。
宜しくお願い致します。
#define NAME "DirectX勉強中"
#define INITGUID
#include <Windows.h>
#include <d3dx9.h>
#define DIRECTINPUT_VERSION 0x0800 // DirectInputのバージョン指定
#include <dinput.h>//ダイレクトインプット(バージョンを指定してからインプット)
// ライブラリのリンク
#pragma once
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"dxguid.lib")
#define SAFE_RELEASE(x) if(x) { x->Release(); x=NULL; }// #define & 構造体の定義
//アプリケーション情報
HINSTANCE hInstApp; //アプリケーションのインスタンスハンドル
HWND g_hWnd = NULL; // Window Handle
LPDIRECT3D9 g_pD3D = NULL; //インターフェイスの取得のためのポインタの作成(構造体)
LPDIRECT3DDEVICE9 g_pDEV = NULL; // 描写用デバイス(インターフェイス)
//デバイス(装置、外部周辺機器)関連を管理するインターフェイス
LPDIRECTINPUTDEVICE8 g_pInput = NULL;//DirectInput8インターフェイスの取得のためのポインタの作成
#define DIDEVICE_BUFFERSIZE 100 // デバイスに設定するバッファ・サイズ
LPDIRECT3DTEXTURE9 pTexture;//背景のテクスチャハンドル
LPD3DXSPRITE pSprite;//スプライトハンドル
D3DXMATRIX m_Matrix;//行列
D3DXVECTOR2 m_vec2;//位置(x座標,y座標)
D3DDISPLAYMODE d3ddm;//画面モード
D3DPRESENT_PARAMETERS d3dpp;//インターフェイスの取得のためのポインタの作成
BYTE diKeyState[256];//キーボード・デバイス定数の状態を設定
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//DirectInputに関する記述(DirectInputの初期化を指す)
LPDIRECTINPUT8 g_pDInput = NULL; // DirectInput
LPDIRECTINPUTDEVICE8 g_pDIDevice = NULL; // DirectInputデバイス
//DirectInputの初期化
bool InitDInput()
{
HRESULT hr;
//1.DirectInput8インターフェイスの取得
hr = DirectInput8Create(hInstApp,//アプリケーションのインスタンスハンドル
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void**)g_pInput,
NULL);
if(FAILED(hr)){return false;}
//2.キーボードデバイスでの設定
hr = g_pDInput->CreateDevice(GUID_SysKeyboard, &g_pDIDevice,NULL);
if(FAILED(hr)){return false;}
//3.データ形式を設定ーーキーボードデバイス用
hr = g_pDIDevice->SetDataFormat(&c_dfDIKeyboard);
if(FAILED(hr)){return false;}
//キーボードの状態を取得
hr = g_pDIDevice->GetDeviceState(sizeof(diKeyState),&diKeyState);
//hr = g_pDIDevice->GetDeviceState(256,diKeyState);
if(SUCCEEDED(hr))
{
}
else if(hr==DIERR_INPUTLOST)
g_pDIDevice->Acquire();
//4.協調モードの設定
hr = g_pDIDevice->SetCooperativeLevel(g_hWnd,//ウインドウハンドル
DISCL_NONEXCLUSIVE|DISCL_FOREGROUND);
if(FAILED(hr)){return false;}
//5.軸モードの設定(この下に相対値モードがあるが今回は絶対値を採用)
//絶対値モード
DIPROPDWORD diprop;
diprop.diph.dwSize = sizeof(diprop);
diprop.diph.dwHeaderSize = sizeof(diprop.diph);
diprop.diph.dwObj = 0;
diprop.diph.dwHow = DIPH_DEVICE;
hr = g_pDIDevice->SetProperty(DIPROP_AXISMODE,
&diprop.diph);
if(FAILED(hr)){return false;}
//6.バッファサイズの設定
diprop.dwData = DIDEVICE_BUFFERSIZE;
hr = g_pDIDevice->SetProperty(DIPROP_BUFFERSIZE, &diprop.diph);
if(FAILED(hr)){return false;}
//7. 入力制御開始
g_pDIDevice->Acquire();
return true;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
HRESULT textureCreate()//テクスチャの作成
{
HRESULT hr;//ハンドル
hr = D3DXCreateTextureFromFile(g_pDEV,"player.png",&pTexture);
if(FAILED(hr))
return false;
return S_OK;
}
//スプライトの作成
HRESULT spriteCreate()
{
HRESULT hr;//ハンドル
hr = D3DXCreateSprite(g_pDEV,&pSprite);//1.使用するデバイス、2.受け取る変数
if(FAILED(hr))
return false;
return S_OK;
}
//スプライトの描画
HRESULT drawsprite()
{
HRESULT hr;//ハンドル
//変換行列を作成
//D3DXMatrixTransformation2D(&m_Matrix,NULL,0,NULL,NULL,0,&D3DXVECTOR2(0,200));
D3DXMatrixTransformation2D(&m_Matrix,NULL,0,NULL,NULL,0,&m_vec2);//座標の指定を変更
//塗りつぶし
g_pDEV->Clear(0, NULL, (D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER),
D3DCOLOR_RGBA(100,100,255,0), 1.0f, 0);
g_pDEV->BeginScene();//スプライトシーンの開始
pSprite->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_DONOTSAVESTATE);
RECT SrcRect = {0,0,32,32}; //テクスチャ内の使用範囲
D3DXVECTOR3 Center(64,49,0); //スプライト内の中心
D3DXVECTOR3 Position(64,64,0);//スプライトを表示する位置、ウインドウの左上が0,0//320,240
hr = pSprite->SetTransform(&m_Matrix);
hr = pSprite->Draw(pTexture,//pSrcTexture,
NULL,
NULL,
NULL,
0xffffffff);
if(FAILED(hr))
return false;
pSprite->End();//スプライトを描画して終了
g_pDEV->EndScene();//シーンを終了
return g_pDEV->Present(NULL, NULL, NULL, NULL);
return S_OK;
}
//初期化処理
HRESULT Init3DDev()
{
//構造体の設定
//インターフェイスの取得
if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL;
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm))) return E_FAIL;
//D3DPRESENT_PARAMETERS構造体の設定
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE; // ウィンドウモード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 映像信号に同期してフリップする
d3dpp.BackBufferFormat = d3ddm.Format;// カラーモードの指定
d3dpp.EnableAutoDepthStencil = TRUE; // デプスバッファ(Zバッファ)とステンシルバッファを作成
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // デプスバッファとして16bitを使う
//デバイスの作成:CreateDeviceの実行
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDEV)))
return E_FAIL;
return S_OK;
}
//ビューポートの作成
HRESULT Viewport()
{
HRESULT hr;//ハンドル
//ビューポートの作成
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = d3dpp.BackBufferWidth;
vp.Height = d3dpp.BackBufferHeight;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
hr = g_pDEV -> SetViewport(&vp);
if(FAILED(hr))
return false;
return S_OK;
}
// DirectX Graphics の終了処理
void Cleanup(void)
{
SAFE_RELEASE(g_pDEV);
SAFE_RELEASE(g_pD3D);
}
//画像の移動
HRESULT idou()
{
//m_vec2.x += 1.0f;//この記述は有効
if(diKeyState[DIK_G] & 0x80)//Gボタンを押したら画像が右に動く
{
m_vec2.x += 1.0f;
}
return S_OK;
}
//全てのまとめ(描画、移動など)
void Action()
{
idou();
drawsprite();
}
// ウィンドウ処理(自分で処理したときは 0 を返す)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
{
switch(msg)
{ case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch(wParam)
{ case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
//★ WinMain()
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,
hInst,NULL,NULL,NULL,NULL,NAME,NULL
};
if (!RegisterClassEx(&wc)) return FALSE;
g_hWnd= CreateWindowEx(0,NAME,NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
if (!g_hWnd) return FALSE;
// DirectX Graphics の初期化(画像関連の初期化であり、キーボード入力、サウンドは別に作る)
if (FAILED(Init3DDev())) return FALSE;
//DirectInputの初期化
InitDInput();
// ウインドウ表示
ShowWindow(g_hWnd, SW_SHOWNORMAL);
UpdateWindow(g_hWnd);
// メッセージ・ループ
ZeroMemory(&msg,sizeof(msg));
textureCreate();//テクスチャの作成
spriteCreate();//スプライトの作成
Viewport();//ビューポートの作成
//画像の初期位置のセット
m_vec2.x = 0.0f;
m_vec2.y = 200.0f;
//ループ
while(msg.message!=WM_QUIT)
{
//プロシージャ
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
Action();
}
//elseを消すとウインドウ終了時にエラーが起きる
}
UnregisterClass(NAME, hInst);
return TRUE;
}