Repsol
Posted: 2011年4月13日(水) 05:57
お世話になります。
DirectX9で、DirectInputを使用しようとしたところ、
件名のようなエラーが生じます。
スプライト(char.png)をキーボード操作によって移動しようとするプログラムを組んでいるのですが、
Win32メッセージ以外で組むのは初めてです。
何分、DirectInputも、まだ少しかじった程度の未熟者です。
また勘違い等している可能性が高いのですが、
よろしければ、ご教授願いたいです。
(基本的なところで間違っていると思います。四苦八苦状態です…)
エラーが出る箇所は決まって、Move()関数内になります。
また、投稿の際に、「投稿禁止単語」がソース内に見つかったので、
その部分は削除させて頂きました。
宜しくお願い致します。
DirectX9で、DirectInputを使用しようとしたところ、
件名のようなエラーが生じます。
スプライト(char.png)をキーボード操作によって移動しようとするプログラムを組んでいるのですが、
Win32メッセージ以外で組むのは初めてです。
何分、DirectInputも、まだ少しかじった程度の未熟者です。
また勘違い等している可能性が高いのですが、
よろしければ、ご教授願いたいです。
(基本的なところで間違っていると思います。四苦八苦状態です…)
#define STRICT // 型チェックを厳密に行う
#define WIN32_LEAN_AND_MEAN // ヘッダーから余り使われない関数を省く
#include <stdio.h>
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <dinput.h>
#pragma warning( disable : 4996 ) // disable deprecated warning
#include <strsafe.h>
#pragma warning( default : 4996 )
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device
LPD3DXSPRITE g_pSprite = NULL; // スプライト変数宣言
LPDIRECT3DTEXTURE9 g_pTexture = NULL; // テクスチャクラス変数宣言
LPDIRECTINPUT8 g_pDinput = NULL; // DirectInputオブジェクトのポインタ
LPDIRECTINPUTDEVICE8 g_lpDIDevice = NULL; // DirectInputデバイスオブジェクトへのポインタ
D3DXVECTOR3 vec3Position;
char ImgFile[] ="char.png";
float fPosition_X = 0, fPosition_Y = 0;
//-----------------------------------------------------------------------------
// 初期化関数
//-----------------------------------------------------------------------------
HRESULT InitDinput(HWND);
VOID Move();
//-----------------------------------------------------------------------------
//HRESULT InitDinput(HWND hWnd)
//ダイレクトインプットの初期化関数
//-----------------------------------------------------------------------------
HRESULT InitDinput(HWND hWnd)
{
HRESULT hr;
// 「DirectInput」オブジェクトの作成
if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL),
DIRECTINPUT_VERSION,IID_IDirectInput8, (VOID**)&g_pDinput, NULL ) ) )
{
return hr;
}
// 「DirectInputデバイス」オブジェクトの作成
if( FAILED( hr = g_pDinput->CreateDevice( GUID_SysKeyboard,
&g_lpDIDevice, NULL ) ) )
{
return hr;
}
// デバイスをキーボードに設定
if( FAILED( hr = g_lpDIDevice->SetDataFormat( &c_dfDIKeyboard ) ) )
{
return hr;
}
// 協調レベルの設定
if( FAILED(hr= g_lpDIDevice->SetCooperativeLevel(
hWnd,DISCL_NONEXCLUSIVE | DISCL_BACKGROUND )) )
{
return hr;
}
// 入力制御開始
g_lpDIDevice->Acquire();
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // true でウィンドウモード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
D3DXCreateSprite( g_pd3dDevice, &g_pSprite ); // スプライトの作成
D3DXCreateTextureFromFileEx( g_pd3dDevice, ImgFile, 0, 0, 0, 0, D3DFMT_A1R5G5B5,
D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR,
D3DCOLOR_ARGB(255,255,255,255), // 透過色の設定
NULL, NULL, &g_pTexture); // テクスチャの読み込み
return S_OK;
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
VOID Move()
{
char key[256];
HRESULT hr;
hr = g_lpDIDevice->GetDeviceState( 256, key);
if FAILED(hr)
{
return;
}
if(key[DIK_LEFT] & 0x80)
{
fPosition_X-=4;
}
if(key[DIK_RIGHT] & 0x80)
{
fPosition_X+=4;
}
if(key[DIK_UP] & 0x80)
{
fPosition_Y-=4;
}
if(key[DIK_DOWN] & 0x80)
{
fPosition_Y+=4;
}
}
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
g_lpDIDevice->Unacquire();
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
if( g_pSprite != NULL)
g_pSprite->Release();
if( g_pTexture != NULL)
g_pTexture->Release();
if( g_pDinput != NULL)
g_pDinput->Release();
if( g_lpDIDevice != NULL)
g_lpDIDevice->Release();
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Rendering of scene objects can happen here
D3DXVECTOR3 vec3Position(fPosition_X,fPosition_Y,0);
// 引数に「D3DXSPRITE_ALPHABLEND」を設定し透過処理
g_pSprite->Begin(D3DXSPRITE_ALPHABLEND); // スプライト描画開始
// スプライト描画関数
g_pSprite->Draw(g_pTexture, NULL, NULL, NULL, 0xFFFFFFFF);
g_pSprite->End(); // スプライト描画終了
// End the scene
g_pd3dDevice->EndScene();
}
// Present the backbuffer contents to the display
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
Move();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// Register the window class
WNDCLASS wc = { sizeof(WNDCLASS), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"D3D Tutorial", NULL };
RegisterClass( &wc );
// Create the application's window
HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 640, 480,
NULL, NULL, wc.hInstance, NULL );
// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// Enter the message loop
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
// ダイレクトインプットの初期化関数を呼ぶ
if(FAILED(InitDinput(hWnd)))
{
return 0;
}
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}また、投稿の際に、「投稿禁止単語」がソース内に見つかったので、
その部分は削除させて頂きました。
宜しくお願い致します。