View Full Version : DirectInput con directx 9.0
ghiotto86
13-06-2005, 15:43
ho letto su msdn che ci sono alcune cose da cambiare per utilizzarle con dx 9.0
bhe io l'ho fatto ma mi dà sempre errore di linkaggio
-Set "#define DIRECTINPUT_VERSION 0x0800" before the include statement for Dinput8.h.
FATTO
-Call DirectInput8Create instead of DirectInputCreateEx.
FATTO
-Link to the Dinput8.lib library instead of Dinput.lib.
come si fa??? è automatico???
devi*includere*nelle*opzioni*del*compilatore*dinput8.lib
fai*progetto*tasto*destro*del*mouse*e*scegli*proprietà*vai*nella
sezione*c++*e*clicca*su*input*scrivi*la*lib*dinput8.lib
ciao
ghiotto86
13-06-2005, 18:44
devi*includere*nelle*opzioni*del*compilatore*dinput8.lib
fai*progetto*tasto*destro*del*mouse*e*scegli*proprietà*vai*nella
sezione*c++*e*clicca*su*input*scrivi*la*lib*dinput8.lib
ciao
okay mi sei di grande aiuto grazie.
strano però che non lo spiega dettagliatamente nemmeno sull'msdn.
grazie
ghiotto86
13-06-2005, 19:08
ops okay non è tutto okay.
mi da quest'errore
Eccezione first-chance a 0x00412b73 in Meshes.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00000000.
Eccezione non gestita a 0x00412b73 in Meshes.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0x00000000.
il mio codice nel winmain è solo questo
HRESULT hr;
hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&g_lpDI, NULL);
hr = g_lpDI->CreateDevice(GUID_SysKeyboard, &g_lpDIDevice, NULL);
if FAILED(hr)
{ // DirectInput not available; take appropriate action
//DI_Term();
MessageBox(hWnd,"Errore","SCEM !!",MB_OK);
return FALSE;
}
perchè mi da quest'errore in runtime.
metti*deibreackpoint*edebugga*perchè*non*posso*certo*capire*cosa*sta*succedendo.
quel*000000000*mi*sembra*il*puntatore*del*device*non*inizializzato*.*posta*più*cpdice*dell'inizializzazione*delle*input*oppure*debugga*e*guarda*quake*è*la*linea*incriminata.
ghiotto86
13-06-2005, 19:53
eh si ho visto col debug e da errore qua
hr = g_lpDI->CreateDevice(GUID_SysKeyboard, &g_lpDIDevice, NULL);
i puntatori g_lpDI e g_lpDIDevice uaguali a NULL.
:( che error è :cry: :cry: ?
ghiotto86
13-06-2005, 19:58
ah ecco c'è altro
quando arrivo a sta linea di codice
hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&g_lpDI, NULL);
mi dice nella finestra di debug
che hr 0x8007047e Il programma specificato richiede una versione più aggiornata di Windows. HRESULT
che significa??
LPDIRECTINPUT8 g_lpDI=NULL;
LPDIRECTINPUTDEVICE8 m_pKeyboard=NULL;
DirectInput8Create(hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&g_lpDI, NULL)
g_lpDI->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, NULL)
metti un breackpoint dopo queste istruzioni e vedi se questi breack point sono passati vedi dove è che si blocca
la dichiarazione l'hai fatta?
ghiotto86
13-06-2005, 20:49
fatto okay ma mi da sempre quell'errore. ti sposto uno screen
http://img10.echo.cx/img10/3717/immagine4jf.jpg (http://www.imageshack.us)
???
Certo che meno male che hai messo uno shoot se no mi mandavi al manicomio pure a me................... ma che faì!!!!!!!!!!
Non devi mai inizializzare le input e quantaltro prima che venga creato il device delle directx.
tutte le inizializzazioni di input sound e quantaltro le devi fare solo dopo che è stato inizializzato il pd3Device delle directx nel tuo caso delle 9.
Trova il punto di questa inizializzzazione e tienilo sempre a mente (lo devi avere nelle Common in DXUT.cpp le righe sono:
pD3D = DXUT_Dynamic_Direct3DCreate9( D3D_SDK_VERSION );
GetDXUTState().SetD3D( pD3D );
) questo è un errore gravissimo proprio da principiante che non ha letto un bel niente e fà solo copia & incolla.
mannaggia............mannaggia!!!!!
l'inizializzazione delle input e quantaltro falla in InitGame() che già c'è di default oppure in un'altra void tua ma sempre dopo l'inizializzazione del devide delle dx.
ciao
ghiotto86
14-06-2005, 15:51
wela okay.
infatti ci avevo pensato e ho fatto come hai detto te guarda:
il mio winmain
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"D3D Tutorial", NULL };
RegisterClassEx( &wc );
// Create the application's window
HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 06: Meshes",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
CreateKeyboard(hWnd);
// Create the scene geometry
if( SUCCEEDED( InitGeometry() ) )
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// Enter the message loop
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render();
ProcessKBInput();
}
}
}
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}
se va bene l'inizializzazione 3d cioè richiamando
HRESULT InitD3D( HWND hWnd )
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// Set up the structure used to create the D3DDevice. Since we are now
// using more complex geometry, we will create a device with a zbuffer.
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
// Create the D3DDevice
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
// Turn on the zbuffer
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
// Turn on ambient lighting
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
return S_OK;
}
allora inizializzo l'input da tastiera richimando CreateKeyborad() cioè
HRESULT CreateKeyboard( HWND hWnd )
{
HRESULT hr;
// Create a DInput object
hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&g_lpDI, NULL );
hr = g_lpDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL );
hr = m_pKeyboard->SetDataFormat( &c_dfDIKeyboard );
hr = m_pKeyboard->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
m_pKeyboard->Acquire();
return S_OK;
}
ma da sempre lo stesso errore.
che sbaglio????? :muro: :muro:
p.s. cmq grazie del principiante se non lo sono io :D :D :sofico:
ghiotto86
14-06-2005, 19:08
è tutto okay
no.
mi da sempre quell'errore :cry: :cry: :cry:
se non ti da fastidio posso mandartelo per e-mail tutto il progetto così vedi l'errore sto impazzendo.
grazie cmq della mano che mi hai dato.
p.s. mandami l'email per pm.
Fenomeno85
14-06-2005, 19:13
non ho visto il codice non ho voglia di vederlo :asd: cmq accedi in una posizione di memoria in cui NON devi accedere controlla cmq i valori che passi se sono corretti o meno
~§~ Sempre E Solo Lei ~§~
Fenomeno85
14-06-2005, 19:15
per caso il valore di hr che utilizzi come ritorno dalla prima lo utilizzi anche nella seconda funzione?? non si vede ce sta la finestra di errore.
Cmq controlla che anche nella prima non ti dia errore.
~§~ Sempre E Solo Lei ~§~
ghiotto86
14-06-2005, 19:36
per caso il valore di hr che utilizzi come ritorno dalla prima lo utilizzi anche nella seconda funzione?? non si vede ce sta la finestra di errore.
Cmq controlla che anche nella prima non ti dia errore.
~§~ Sempre E Solo Lei ~§~
alla fine hr è una variabile hresult che ti serve per vedere se le varie inizializzazione sono andate a buon fine.
anche facendo così
VOID CreateKeyboard( HWND hWnd )
{
// Create a DInput object
DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&g_lpDI, NULL );
g_lpDI->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, NULL);
m_pKeyboard->SetDataFormat( &c_dfDIKeyboard );
m_pKeyboard->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
m_pKeyboard->Acquire();
}
nada :cry: :cry: :cry:
ghiotto86
14-06-2005, 19:37
cmq il problema è in questa linea qui
g_lpDI->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, NULL);
:muro: :muro: :muro:
ghiotto86
14-06-2005, 20:22
guardate qua
http://img10.echo.cx/img10/8774/immagine2za.jpg (http://www.imageshack.us)
è come se non fosse inizializzato g_lpDI che è messo a 0.
che succede??? :mc: :mc:
Fenomeno85
14-06-2005, 21:30
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDirectInput, NULL)))
exit (-1);
~§~ Sempre E Solo Lei ~§~
ghiotto86
14-06-2005, 21:44
infatti provato.
ho cambiato la funzione che crea il dispositivo così
HRESULT CreateKeyboard( HWND hWnd )
{
HRESULT hr;
// Create a DInput object
if (FAILED(hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&g_lpDI, NULL )))
return hr;
if(FAILED(hr = g_lpDI->CreateDevice(GUID_SysKeyboard , &m_pKeyboard, NULL)))
return hr;
if(FAILED(hr = m_pKeyboard->SetDataFormat( &c_dfDIKeyboard )))
return hr;
hr = m_pKeyboard->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
if( FAILED(hr) )
return hr;
m_pKeyboard->Acquire();
return S_OK;
}
e infatti quando debuggo mi da errore qua
http://img14.echo.cx/img14/6629/immagine6hc.jpg (http://www.imageshack.us)
che non ho capito cosa ca@@o è: c'è bisogno di una versione di windows più aggiornata bhaa.
se vuoi ti posso anche mandare il prog completo così spacchi tutto anche te :D
il cast ci vuole perchè LPDIRECTINPUT8 g_lpDI =NULL;
è la funzione come hai visto accetta solo lpvoid.
ghiotto86
14-06-2005, 21:51
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDirectInput, NULL)))
exit (-1);
~§~ Sempre E Solo Lei ~§~
si infatti esce
ghiotto86
14-06-2005, 22:15
RISOLTOOOOOOOOOOOOOOOOOOOO :sofico:
ghiotto86
14-06-2005, 22:53
ecco errore che se ne va altro che viene :D
ora per processare i tasti premuti il tutorial msdn implementa sta funzione
void WINAPI ProcessKBInput()
{
#define KEYDOWN(name, key) (name[key] & 0x80)
BYTE buffer[256];
HRESULT hr;
ZeroMemory( buffer, sizeof(buffer) );
hr = m_pKeyboard->GetDeviceState(sizeof(buffer),buffer);
if FAILED(hr)
{
// If it failed, the device has probably been lost.
// Check for (hr == DIERR_INPUTLOST)
// and attempt to reacquire it here.
return;
}
// Turn the spaceship right or left
if (KEYDOWN(buffer, DIK_RIGHT))
exit(-1);
// Turn right.
}
però appena arrivato quà
hr = m_pKeyboard->GetDeviceState(sizeof(buffer),buffer);
mi da errore
hr 0x8007000c Codice di accesso non valido. HRESULT
che è??
ghiotto86
15-06-2005, 13:30
HELP
ghiotto86
15-06-2005, 18:20
vi metto anche uno screen dai :D
http://img113.echo.cx/img113/9418/immagine3av.jpg (http://www.imageshack.us)
okay dove seiiiiiiiiiiiiii???? :(
nello screen hai g_pKeyBoard
nell'altro code hai m_pKeyboard
ma come mai fai queste cose strane............
ghiotto86
15-06-2005, 19:19
nello screen hai g_pKeyBoard
nell'altro code hai m_pKeyboard
ma come mai fai queste cose strane............
ho cambiato io di proposito, e poi me lo direbbe prima il compilatore che non trova una delle due variabili non dichiarate, penso non sia quello il problema :cry: :cry:
ghiotto86
15-06-2005, 19:25
che significa quel "codice di accesso non valido" ???? :confused:
per tagliare la testa al toro
dal browser delle directx vai su DirectInput e installa il progetto c++. Poi aprilo ed eseguilo, guarda se tutto è okay.
quell'errore in hr è molto strano (se sei sicuro di aver inizializzatutto per bene)
fai questa prova.
Se le inizializazzioni sono corrette (e dal code mi pare di si) è strano quellla diciditura sullla versione non corretta.
Non è per caso che hai disinstallato male vecchie versioni di directx??
se così fosse dovresti formattare (ma io non lo credo visto che hai XP)
ghiotto86
15-06-2005, 20:15
per tagliare la testa al toro
dal browser delle directx vai su DirectInput e installa il progetto c++. Poi aprilo ed eseguilo, guarda se tutto è okay.
quell'errore in hr è molto strano (se sei sicuro di aver inizializzatutto per bene)
fai questa prova.
Se le inizializazzioni sono corrette (e dal code mi pare di si) è strano quellla diciditura sullla versione non corretta.
Non è per caso che hai disinstallato male vecchie versioni di directx??
se così fosse dovresti formattare (ma io non lo credo visto che hai XP)
il fatto molto strano è che quel sample di msdn funzia alla grandissima.
il pc l'ho formatttato da poco e ho installato directx 9.0c , ma se funziona con quell'esempio del browser deve funzionare anche col mio :cry: :cry:
se hai un po di tempo potresti mandarmi un progetto semplicissimo che fa renderizza solo una finestra con un background a piacere e implementi le directinput e quando premi per esempio GIU appare una messagebox che mi dice hai premuto il tasto.
penso che sia molto semplice per te.
cmq ti ringrazio della mano che mi dai grazie.
ghiotto86
15-06-2005, 20:44
ho visto il messaggio privato.
ti ho inviato na mail.
ciao
ho visto il messaggio privato.
ti ho inviato na mail.
ciao
facciamo che mi mandi il tuo progetto che sono curioso di vedere perchè quell'errore in hr
ghiotto86
15-06-2005, 22:26
facciamo che mi mandi il tuo progetto che sono curioso di vedere perchè quell'errore in hr
ciao te l'ho mandato il progetto.
hai visto????
Non sto in postazione ora
comq devi fare questa correzione
hr = g_pKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
non passi l'indirizzo di buffer.
le define vanno come globali all'esterno del main:
#define KEYDOWN(name, key) (name[key] & 0x80)
e la funzione:
HRESULT ProcessKBInput(HWND hWnd)
{
è sgradevole all'inizio mettila alla fine, finchè il codice è corto o solo per provare va bene ma inizia a indentare il codice
ciao
p.s. se devi mandare progetti non mandarli completi manda solo il .vcproj e gli h e cpp la cartella di debug common e il .ncb non mandarle mai occupano solo una marea di spazio.
ghiotto86
17-06-2005, 17:58
Non sto in postazione ora
comq devi fare questa correzione
hr = g_pKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
non passi l'indirizzo di buffer.
le define vanno come globali all'esterno del main:
#define KEYDOWN(name, key) (name[key] & 0x80)
e la funzione:
HRESULT ProcessKBInput(HWND hWnd)
{
è sgradevole all'inizio mettila alla fine, finchè il codice è corto o solo per provare va bene ma inizia a indentare il codice
ciao
p.s. se devi mandare progetti non mandarli completi manda solo il .vcproj e gli h e cpp la cartella di debug common e il .ncb non mandarle mai occupano solo una marea di spazio.
ok cmq già risolto era una paresentesi graffa di merd@ :mad:
grazie del tuo aiuto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.