DirectInput reagiert nicht auf tastatur
-
Ich habe Opengl aufgegeben und mich mit directX beschäftigt.Ich habe Tutorials die ich fand durchgemacht. zwar bin ich noch nicht sehr weit ( beim dreieck) aber es wurde schon Direct Input erklärt. Und da man ja bei selbstgemachten schneller lernt habe ich probiert etwas zu programmieren. Leider reagiert irgendwie DirectInput nicht. Hier meine Daten:
main.cpp:
//Includedateien #include "window.h" #include "main.h" #include "input.h" //globale variablen für directX3d9 LPDIRECT3D9 D3D9; LPDIRECT3DDEVICE9 D3D9Dev ; LPDIRECT3DVERTEXBUFFER9 D3DVertexBuffer9 ; float rotation = 0.0f, zline = 0.0f; bool Bild_erstellen() { //Present Parameter Variable festlegen und eigenschasften einstellen D3DPRESENT_PARAMETERS D3DPP; ZeroMemory(&D3DPP, sizeof(D3DPP)); D3DPP.hDeviceWindow = hWnd; D3DPP.Windowed = true; D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; D3DPP.BackBufferFormat= D3DFMT_X8R8G8B8; D3DPP.BackBufferWidth = nBreite; D3DPP.BackBufferHeight= nHoehe; //DirectX Object erzeugen if(!(D3D9 = Direct3DCreate9(D3D_SDK_VERSION))) { MessageBox(NULL, "Sie haben die falsche DirectX Version.\nSie brauchen DirectX 9.", "Fehler", MB_OK); return false; } //Bild erstellen D3D9->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &D3DPP, &D3D9Dev); Grafik_initialisieren(); // Turn off culling, so we see the front and back of the triangle D3D9Dev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); D3D9Dev->SetRenderState(D3DRS_LIGHTING, false); return true; } void Bild_rendern(void) { //Prüfen, ob D3D9Dev erstellt wurde if(D3D9Dev == NULL) return; //Bild rendern // backbuffer löschen D3D9Dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 50, 100), 1.0f, 0); //Szene beginnen D3D9Dev->BeginScene(); //Szene gestalten: D3DXMATRIX matRotateY; //MAtrix für rotierende Kamera bestimmen rotation += 0.03f; //Variable: Kamera um 3° rechst rotieren lassen D3DXMatrixRotationY(&matRotateY, rotation); //Funktion: Kamera um index rotieren lassen D3D9Dev->SetTransform(D3DTS_WORLD, &matRotateY); //Welt transformieren D3DXMATRIX matView; //Matrix für Sicht bestimmen zline += -0.1f; //Kammera um 10 cm pro frame nach hinten verschieben D3DXMatrixLookAtLH( &matView, //Kamera setzen &D3DXVECTOR3(0.0f, 0.0f,4.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); D3D9Dev->SetTransform(D3DTS_VIEW, &matView); //Sicht erstellen D3DXMATRIX matProjection; //MAtrix für Projektion erstellen D3DXMatrixPerspectiveFovLH(&matProjection, 45.0f, nBreite/nHoehe, 62.0f, 0.0f); //Kameraaussicht bestimmen D3D9Dev->SetTransform(D3DTS_PROJECTION, &matProjection); //Projezieren //Vertexformat auswählen D3D9Dev->SetFVF(COSTUMFVF); //Zum Buffern auswählen D3D9Dev->SetStreamSource(0, D3DVertexBuffer9, 0, sizeof(VERTEX)); //Dreieck malen D3D9Dev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1); //Szene beenden D3D9Dev->EndScene(); //Bild zeigen D3D9Dev->Present(NULL, NULL, NULL, NULL); return; } void Programm_beenden() { //Direct3D aufräumen------------------------------- //Inhalt der Variablen löschen: if(D3DVertexBuffer9 != NULL) D3DVertexBuffer9->Release(); if(D3D9 != NULL) D3D9->Release(); if(D3D9Dev != NULL) D3D9Dev->Release(); //DirectInput aufräumen----------------------------- //Geräte nicht mehr anwerben if(!DI8Dev->Unacquire()) {} //Falls DI8 nicht Null ist releasen if(DI8 != NULL) DI8->Release(); return; } void Grafik_initialisieren(void) { VERTEX t_vert[] = { { -1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), }, { 1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), }, { 0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), }, }; D3D9Dev->CreateVertexBuffer( 3*sizeof(VERTEX), 0, COSTUMFVF, D3DPOOL_DEFAULT, &D3DVertexBuffer9, NULL); VOID* pVoid; D3DVertexBuffer9->Lock(0, 0, (void**)&pVoid, 0); memcpy(pVoid, t_vert, sizeof(t_vert)); D3DVertexBuffer9->Unlock(); return; }main.h
#ifndef _MAIN_H #define _MAIN_H //includes #include <d3dx9.h> //Funktionen extern bool Bild_erstellen(void); extern void Bild_rendern(void); extern void Programm_beenden(void); extern void Grafik_initialisieren(void); extern bool Init_DirectInput(HINSTANCE hInstance, HWND hWnd); extern void Abfrage_DirectInput(void), Programm_beenden(void); //DirectX: //Direct X selber und das device extern LPDIRECT3D9 D3D9; extern LPDIRECT3DDEVICE9 D3D9Dev ; extern LPDIRECT3DVERTEXBUFFER9 D3DVertexBuffer9 ; //strukturen struct VERTEX { float x, y, z; DWORD color;}; #define COSTUMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE) extern float rotation,zline; #endifwindow.cpp
#include "main.h" #include "window.h" #include "input.h" //Globale Variabeln fürs fenster HWND hWnd = NULL; //Bildschirm größe int nBreite = GetSystemMetrics(SM_CXSCREEN); int nHoehe = GetSystemMetrics(SM_CYSCREEN); LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_DESTROY: { PostQuitMessage(0); return 0; } break; default: break; } return (DefWindowProc(hWnd, Msg, wParam, lParam)); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //Funktion variablen für.. //Fenstereigenschaften WNDCLASS wc; //Messaevariable MSG msg; //Stil festlegen wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpszMenuName = NULL; wc.lpszClassName= "Hauptklasse"; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground= (HBRUSH) GetStockObject(WHITE_BRUSH); wc.cbWndExtra = false; wc.cbClsExtra = false; //Fenster regestrieren RegisterClass(&wc); hWnd = CreateWindowEx( 0, "Hauptklasse", "Mein 15 WinAPI Fenster", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, nBreite/2, nHoehe/2, NULL, NULL, hInstance, NULL); if(Init_DirectInput(hInstance, hWnd)==false) MessageBox(NULL,"Keine Eingaben möglich!","",16); //Bild erstenllen if(!Bild_erstellen()) { MessageBox(NULL,"Fehler beim erstellen des Bildes","Fehler",16); return 0; } while(TRUE) { Abfrage_DirectInput(); Bild_rendern(); //Nachrichten da? if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { //wenn WM_QUIT... if(msg.message == WM_QUIT) break; //stoppen DispatchMessage(&msg); TranslateMessage(&msg); } } Programm_beenden(); return msg.message; }window.h
#ifndef _WINDOW_H #define _WINDOW_H //Includes #include <windows.h> //Globale Variabeln fürs fenster extern HWND hWnd; extern int nBreite; extern int nHoehe; extern MSG msg; //CALLBACK-funktion extern LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); extern int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); #endifinput.cpp
#include "main.h" #include "window.h" #include "input.h" //Variabeln(objeckte) DirectInput LPDIRECTINPUT8 DI8; LPDIRECTINPUTDEVICE8 DI8Dev; void Abfrage_DirectInput(void) { //Variable keystate erstellen static BYTE keystate[256]; //Keyboard "erwerben" DI8Dev->Acquire(); //Gerätestatus abfragen DI8Dev->GetDeviceState(256, (LPVOID)&keystate); //Wenn Taste [name] gedrückt reagiere ich so if(keystate[DIK_W] & 0x80) // go += 0.1f; if(keystate[DIK_S] & 0x80) // go -= 0.1f; if(keystate[DIK_SPACE] & 0x80) MessageBox(hWnd, "Programm beenden?", "", MB_YESNO); // goright -= 0.1f; if(keystate[DIK_D] & 0x80) // goright += 0.1f; if(keystate[DIK_ESCAPE] & 0x80) if(MessageBox(hWnd, "Programm beenden?", "", MB_YESNO)==IDYES) PostMessage(NULL, WM_QUIT, 0, 0); return; } bool Init_DirectInput(HINSTANCE hInstance, HWND hWnd) { //Rückgabe wert HRESULT hr; //DirectInput8 Object erstellen hr = DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&DI8, NULL); if(FAILED(hr)) { MessageBox( hWnd, "DirectInputObject konnte nicht erstellt werden!", "Fehler", 16); return false; } //Ferät einstellen hr = DI8->CreateDevice(GUID_SysKeyboard, &DI8Dev, NULL); if(FAILED(hr)) { MessageBox( hWnd, "Das DirectInputDevice8 konnte nicht eingestellt werden!", "Fehler", 16); return false; } //Datenformat festlegen DI8Dev->SetDataFormat(&c_dfDIKeyboard); //Kooperationslevel bestimmen DI8Dev->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); return true; }input.h
#ifndef _INPUT_H #define _INPUT_H //Includes #include <dinput.h> #include <stdio.h> //DirectX input extern LPDIRECTINPUT8 DI8; extern LPDIRECTINPUTDEVICE8 DI8Dev; extern HRESULT hr; #endifIch habe einige Fehler beseitigt. Aber
DirectInput reagiert immer noch nicht.
Ich hoffe ihr könnt mir helfen..
-
Du solltest mal den Rückgabewert von GetDeviceState prüfen, und bei einem Fehler D3DXGetErrorDescription9 (oder so ähnlich) ausgeben.
Wenn das nicht hilft, kannst du DirectInput auf Debug stellen ( in der Systemsteuerung) und dir anschauen, was so im Debugger ausgegeben wird.
-
Danke für die Antwort.
Ich weiß zwar das es sowas gibt hab nur nicht dran gedacht.
-
Wo sind eigentlich die debuglogs.

-
Ok ich hab denn Fehler gefunden:
bei der abfrage hatte ich einige zeilen zu kommentare gemacht
dadurch wurden diese übersprung. also im klartext:
if(g-gedrück)
kommentar
if(ecape)
...klar erst muß D und dann Escape.
(siehe Datei:input.cpp, funktion:void Abfrage_DirectInput(void))Trotzdem danke für die hilfe.