Dinput Problem



  • Hallo,
    ich hab folgende dinput Funktion geschrieben, die es mir erleichtert auf die
    "Stellungen" der Tasten zuzugreifen, indem sie ein Array von defines(z.B #define AK_SCHIESSEN) füllt. Wenn ich die Funktionaner in der Hauptschleife aufrufe und die Werte prüfe und dann beim Drücken einer Taste z. B. den Backbuffer flippen will, passiert nichts. Woran kann das liegen? Danke schon mal im voraus.
    MFG Julian



  • so kann dir irgendwie niemand weiter helfen - erkläre das Problem etwas genauer - so von den Angaben her kann man deinen Fehler auch nicht erahnen



  • Poste mal den Code, formulier das Problem genauer und dann können wir dir eventuell helfen.



  • Ok,
    ich hab eine Datei directInput.cpp in der es die Funktion Dinput_Update und DInput_Keyboard_Update gibt. In der Funktion Dinput_Update wird das Array Eingabe gefüllt(mit true oder false Werten).Ich hoffe der Code ist nicht zu lang:

    char Tasten_Puffer[256];
    
    // --------//
    
    bool Eingabe[AK_MAXIMAL];
    bool DInput_Keyboard_update(void)
    {
    	HRESULT dirval;
    	dirval = lpDIKeyboard->GetDeviceState(sizeof(Tasten_Puffer),(LPVOID)&Tasten_Puffer);
    	if(dirval != DI_OK)
    	{
    		if(dirval == DIERR_INPUTLOST)
    		{
    			if(lpDIKeyboard)
    			{
    				lpDIKeyboard->Acquire();
    				dirval = lpDIKeyboard->GetDeviceState(sizeof(Tasten_Puffer),(LPVOID)&Tasten_Puffer);
    				if(dirval != DI_OK)
    				{
    					MessageBox(hwnd,"Fehler bei DInput Update()","BANG",MB_ICONEXCLAMATION);
    					return false;
    				}
    			}
    			}
    			else {
    				MessageBox(hwnd,"Dinput Fehler KB: GetDSTATE()","Bang",MB_ICONEXCLAMATION);
    				return false;
    			}
    	}
    	   return true;
    }
    
    bool Dinput_Update(void)
    {
    	if(DInput_Keyboard_update() == false)
    		return false;
    
        if (TASTE(DIK_SPACE))
    		Eingabe[AK_SCHIESSEN] = true;
    	else 
    		Eingabe[AK_SCHIESSEN] = false;
    
    	if (TASTE(DIK_ESCAPE))
    		Eingabe[AK_BEENDEN] = true;
    	else 
    		Eingabe[AK_BEENDEN] = false;
    
    	if (TASTE(DIK_LEFT))
    		Eingabe[AK_LINKSGEHEN] = true;
    	else Eingabe[AK_LINKSGEHEN] = false;
    
    	if (TASTE(DIK_RIGHT))
    		Eingabe[AK_RECHTSGEHEN] = true;
    	else 
    		Eingabe[AK_RECHTSGEHEN] = false;
    
    return true;
    }
    

    In der Datei Main.cpp benütze ich dann das Array um herauszufinden welche Tasten gedrückt wurden und daraufhin eine aktion wie z.B. Schiessen aufzurufen.
    Code:

    extern bool Eingabe[AK_MAXIMAL];
    
    while(!done)
    	{
            while(PeekMessage(&message,NULL,0,0,PM_REMOVE))
    	    {
    		    TranslateMessage(&message);
    		    DispatchMessage(&message);
    	    }
    switch(Spiel_Zustand)
    	    {
    	       case SPIEL_MENU:
    			   {
    			   Spiel_Zustand = SPIEL_START;
    			   } break;
    		   case SPIEL_START:
    			   {
    				 Spiel_Zustand = SPIEL_LAUEFT;
    			   } break;
    		   case SPIEL_NEUSTART:
    			   {
    			   Spiel_Zustand = SPIEL_START;
    			   } break;
    		   case SPIEL_LAUEFT:
    			   {
    			           Dinput_Update();
                                           if(Eingabe[AK_SCHIESSEN]
                                               erzeuge_schuss();
                                   } break;
    		   case SPIEL_ESCAPE:
    			   {
    				   Spiel_Zustand = SPIEL_MENU;
    			   } break;
    		   default: break;
    		} //Switch
    

    Wenn ich jetzt aber im Spiel die Taste drücke passiert nichts. MFG Julian



  • AFAIK liefert DInput kein true und false.



  • Was meinst du mit DInput liefert kein true und false?
    Julian



  • Wie ist das definiert??

    TASTE(DIK_SPACE)



  • So:

    #define TASTE(Taste) (Tasten_Puffer[Taste] & 0x80)
    

    Julian



  • Weiß echt keiner was mein Problem sein könnte??
    MFG Julian



  • Also, ich bin den Code-Schnipsel durchgegangen, und komm einfach nicht drauf, wo der Fehler liegt. 😕
    Und du bekommst ganz sicher keine Message-Box??
    (Im Fullscreen-Modus sieht man die Message-Boxes nicht ⚠ )

    char Tasten_Puffer[256];
    ...
    dirval = lpDIKeyboard->GetDeviceState(sizeof(Tasten_Puffer),(LPVOID)&Tasten_Puffer);
    

    Hier kannst du auch ein bool – Array benutzen. - Aber das löst das Problem ja nicht 😉

    if(dirval == DIERR_INPUTLOST)
    

    Hier würde ich auch auf DIERR_NOTACQUIRED testen.

    if(Eingabe[AK_SCHIESSEN] 
            erzeuge_schuss();
    

    Hier fehlt eine Klammer, aber das ist sicher nur ein Tipp-Fehler.

    Ich kann beim besten Willen keinen Fehler in dem Code-Fragment erkennen. Ich brauch einfach mehr Code dazu.
    Poste einfach alles, was in deinem Programm mit DirectInput zu tun hat. (Vor allem die Initialisierungen von Dinput und DInputDevice) Und zwar ganze Files (*.h, *.cpp, ...). Wenn’s zu groß sein sollte, kannst du es mir auch per E-Mail senden. Die Adresse müsste im Profil stehen.



  • Hallo,
    erst mal Danke für deine Tipps. Hier ist erst mal der Code von der Datei DInput.cpp:

    // Includes
    #include <ddraw.h>
    #include <dinput.h>
    #include "Global.h"
    #include "DDinput.h"
    // Globals
    
    extern HWND hwnd;
    
    // Objekte
    LPDIRECTINPUT8     lpDI;
    LPDIRECTINPUTDEVICE8 lpDIKeyboard;
    
    // Variablen
    
    char Tasten_Puffer[256];
    
    // --------//
    
    bool Eingabe[AK_MAXIMAL];
    
    // F U N K T I O N E N
    
    bool DInput_initialisieren(HINSTANCE hinst)
    {
    	HRESULT dirval;
    
    	dirval = DirectInput8Create(hinst, DIRECTINPUT_VERSION, IID_IDirectInput8,
    		                         (LPVOID *)&lpDI,NULL);
    
    	if(dirval != DI_OK)
    	{
    		MessageBox(hwnd,"Fehler bei CreateInput 8","Bang",MB_ICONEXCLAMATION);
    		return false;
    	}
    
    	// Keyboard
    
    	dirval = lpDI->CreateDevice(GUID_SysKeyboard,&lpDIKeyboard,NULL);
    	if(dirval != DI_OK)
    	{
    		MessageBox(hwnd,"Fehler bei Create Keyboard","Bang",MB_ICONEXCLAMATION);
    		return false;
    	}
    
    	dirval = lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard);
    	if(dirval != DI_OK)
    	{
    		MessageBox(hwnd,"fehler bei Set Data","Bang",MB_ICONEXCLAMATION);
    		return false;
    	}
    
    	dirval = lpDIKeyboard->SetCooperativeLevel(hwnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
    	if(dirval != DI_OK)
    	{
    		MessageBox(hwnd,"Fehler bei SetCoop","Bang",MB_ICONEXCLAMATION);
    		return false;
    	}
    
    	if(lpDIKeyboard)
    	{
    		dirval = lpDIKeyboard->Acquire();
    		if(dirval != DI_OK)
    		{
    			 MessageBox(hwnd,"Fehler bei Acquire","Bang",MB_ICONEXCLAMATION);
    			 return false;
    		}
    	}
    	else return false;
    
    	return true;
    }
    
    bool DInput_Keyboard_update(void)
    {
    	HRESULT dirval;
    	dirval = lpDIKeyboard->GetDeviceState(sizeof(Tasten_Puffer),(LPVOID)&Tasten_Puffer);
    	if(dirval != DI_OK)
    	{
    		if(dirval == DIERR_INPUTLOST)
    		{
    			if(lpDIKeyboard)
    			{
    				lpDIKeyboard->Acquire();
    				dirval = lpDIKeyboard->GetDeviceState(sizeof(Tasten_Puffer),(LPVOID)&Tasten_Puffer);
    				if(dirval != DI_OK)
    				{
    					MessageBox(hwnd,"Fehler bei DInput Update()","BANG",MB_ICONEXCLAMATION);
    					return false;
    				}
    			}
    			}
    			else {
    				MessageBox(hwnd,"Dinput Fehler KB: GetDSTATE()","Bang",MB_ICONEXCLAMATION);
    				return false;
    			}
    	}
    	   return true;
    }
    
    bool Dinput_Update(void)
    {
    	if(DInput_Keyboard_update() == false)
    		return false;
    
        if (TASTE(DIK_SPACE))
    		Eingabe[AK_SCHIESSEN] = true;
    	else 
    		Eingabe[AK_SCHIESSEN] = false;
    
    	if (TASTE(DIK_ESCAPE))
    		Eingabe[AK_BEENDEN] = true;
    	else 
    		Eingabe[AK_BEENDEN] = false;
    
    	if (TASTE(DIK_LEFT))
    		Eingabe[AK_LINKSGEHEN] = true;
    	else Eingabe[AK_LINKSGEHEN] = false;
    
    	if (TASTE(DIK_RIGHT))
    		Eingabe[AK_RECHTSGEHEN] = true;
    	else 
    		Eingabe[AK_RECHTSGEHEN] = false;
    
    return true;
    }
    
    void DInput_beenden(void)
    {
    	if(lpDI != NULL)
    	{
    		if(lpDIKeyboard != NULL) {
    			lpDIKeyboard->Unacquire();
    			lpDIKeyboard->Release();
    			lpDIKeyboard = NULL;
    		}
    		lpDI->Release();
    		lpDI = NULL;
    	}
    }
    
    Und hier von der Headerdatei:
    
    // Makros
    #define TASTE(Taste) (Tasten_Puffer[Taste] & 0x80)
    
    // Prototypen 
    
    bool DInput_initialisieren(HINSTANCE hinst);
    bool DInput_Keyboard_update(void);
    bool Dinput_Update(void);
    void DInput_beenden(void);
    

    Das wars. Die Aufrufe hab ich ja schon gepostet.
    MFG Julian



  • Hmm, an diesem Code liegt der Fehler sicherlich nicht. Scheint alles korrekt zu sein.



  • Hallo,
    danke für eure Antworten. Ich hab das Problem jetzt gelöst.
    MFG Julian



  • Wo lag der Fehler?



  • Hallo,

    case SPIEL_MENU:
    			   {
    				   Dinput_Update();
    				   if(Eingabe[AK_SCHIESSEN])
                                            Puffer_wechseln();
    				   Spiel_Zustand = SPIEL_LAUEFT;
    			   } break;
    		   case SPIEL_START:
    			   {
    
    			   } break;
    		   case SPIEL_NEUSTART:
    			   {
    			   Spiel_Zustand = SPIEL_START;
    			   } break;
    		   case SPIEL_LAUEFT:
    			   {
    
    			   } break;
    		   case SPIEL_ESCAPE:
    

    Obens sieht man, dass ich die Anweisung Spiel_Zustand = SPIEL_LAUEFT nicht in die if-Abfrage mit aufgenommen hab und dadurch wird dinput nur einmal aufgerufen => Keine Registrierung des Tastenfrucks.
    MFG Julian


Anmelden zum Antworten