Dinput Problem



  • 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