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;
    
    #endif
    

    window.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);
    
    #endif
    

    input.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;
    
    #endif
    

    Ich 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.


Anmelden zum Antworten