Joystick einlesen



  • Hi Leute,

    ich hab zwecks verwendung eines Joysticks mit DirectX 9 folgende Klasse geschrienben.

    dabei muss (wenn ich's richtig verstanden hab) ich einen Zeiger auf die Callback-Funktion übergeben (2 Paramater der EnumDevices in exists). Wenn ich dafür, wie gezeigt, die EnumJoystickCallback angebe, wird folgener Fehler geschmissen:

    g:\dateien\cstart\start\joystick.cpp(22) : error C2664: 'EnumDevices' : Konvertierung des Parameters 2 von 'int (const struct DIDEVICEINSTANCEA *,void *)' in 'int (__stdcall *)(const struct DIDEVICEINSTANCEA *,void *)' nicht moeglich
            Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
    

    Dann hier noch der Code:

    Joystick.cpp

    #include "Joystick.h"
    
    Joystick::Joystick(IDIRECTINPUT8 lp){
    	lpDI=lp;
    
    }
    
    Joystick::~Joystick(){
    
    }
    
    BOOL CALLBACK Joystick::EnumJoystickCallback( const DIDEVICEINSTANCE* pDInstance, VOID* pContext){
    	HRESULT hr;
    
    	if(FAILED(hr=lpDI->CreateDevice(pDInstance->guidInstance, &lpDIJoystick, NULL))){
    		return DIENUM_CONTINUE;
    	}
    
    	return DIENUM_STOP;
    }
    
    BOOL Joystick::exists(){
    HRESULT hr;
    
    	if( FAILED(hr=lpDI->EnumDevices( DI8DEVCLASS_GAMECTRL,EnumJoystickCallback,NULL, DIEDFL_ATTACHEDONLY ) )){
    		return false;
    	}else{
    		return true;
    	};
    }
    

    Joystick.h

    #include <windows.h>
    #include <dinput.h>
    
    #ifndef JOYSTICK_H
    #define JOYSTICK_H
    #define DIRECTINPUT_VERSION 0x0800
    
    class Joystick  {
    
    public:
    	Joystick(IDIRECTINPUT8 lp);
    	~Joystick();
    
    	BOOL CALLBACK EnumJoystickCallback(  const DIDEVICEINSTANCE* pdidInstance, VOID* pContext);
    	BOOL exists();
    
    private:
    	IDIRECTINPUT8 lpDI;
    	LPDIRECTINPUTDEVICE8* lpDIJoystick;
    
    };
    
    #endif
    

    Danke schonmal...



  • void InitDirectInput(HWND hDlg)
    {
    
        //-------------------------------------------------------------------------
        //  Register with the DirectInput subsystem and get a pointer
        //-------------------------------------------------------------------------
        if( FAILED( hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,IID_IDirectInput8, (VOID**)&g_pDI, NULL )))
        Form1->Memo1->Lines->Add("Error: failed to create DirectInput interface");
        else
        Form1->Memo1->Lines->Add("- DirectInput initialized");
    
        //--------------------------------------------------------------------------
        //  Enumerate Devices
        //--------------------------------------------------------------------------
        if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,EnumJoysticksCallback,NULL, DIEDFL_ATTACHEDONLY ) ) )
        Form1->Memo1->Lines->Add("Error: failed to enum devices");
        else
        Form1->Memo1->Lines->Add("- Enum device created");
    
        //--------------------------------------------------------------------------
        //  Init default input devices
        //--------------------------------------------------------------------------
         if (FAILED(hr = g_pDI->CreateDevice(GUID_SysKeyboard, &g_Keyb, NULL)))
         Form1->Memo1->Lines->Add("Error: Can´t init keyboard");
    
         if (FAILED(hr = g_pDI->CreateDevice(GUID_SysMouse, &g_Mouse, NULL)))
         Form1->Memo1->Lines->Add("Error: Can´t init mouse");
    
        //--------------------------------------------------------------------------
        //  Make sure we got a Joystick and all other default devices
        //--------------------------------------------------------------------------
    
        if(NULL == g_pJoystick || NULL == g_Mouse || NULL == g_Keyb)
        {
    
          initfailed  = true;
          MessageBox( NULL, TEXT("Joystick or default input device not found."),TEXT("JbindX"),MB_ICONERROR | MB_OK );
          Form1->Memo1->Lines->Add("Error: find a input device");
          Form1->Button1->Enabled = false;
          Form1->Button2->Enabled = false;
          Form1->Button3->Enabled = false;
    
        }
        else
        {
    
         Form1->Memo1->Lines->Add("- DirectInput devices set up");
    
        //-------------------------------------------------------------------------
        //   Set the data format for all devices - a predefined data format
        //-------------------------------------------------------------------------
        if( FAILED( hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 )))
        Form1->Memo1->Lines->Add("Error: failed to set data format");
        else
        Form1->Memo1->Lines->Add("- Joystick data format set up");
    
         //------------
        //- default input
        //-----------------------------
        if( FAILED( hr = g_Keyb->SetDataFormat(&c_dfDIKeyboard)))
        Form1->Memo1->Lines->Add("failed to set keyboard data format");
    
        if( FAILED( hr = g_Mouse->SetDataFormat(&c_dfDIMouse2)))
        Form1->Memo1->Lines->Add("failed to set mouse data format");
    
        //-------------------------------------------------------------------------
        //  Set Cooperative Level
        //-------------------------------------------------------------------------
    
         if(FAILED(hr = g_pJoystick->SetCooperativeLevel( hDlg ,DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)))
         Form1->Memo1->Lines->Add("Error: failed to set cooperative level");
         else
         Form1->Memo1->Lines->Add("- Setting cooperative level");
    
         //---------------
         // default devices coop
         //-----------------------------
    
         if(FAILED(hr = g_Keyb->SetCooperativeLevel( hDlg , DISCL_NONEXCLUSIVE | DISCL_BACKGROUND))) //Keyboard zugriff
         Form1->Memo1->Lines->Add("Error: failed to set keyboard cooperative");
    
         if(FAILED(hr = g_Mouse->SetCooperativeLevel( hDlg , DISCL_NONEXCLUSIVE | DISCL_BACKGROUND))) //Mouse zugriff
         Form1->Memo1->Lines->Add("Error: failed to set mouse cooperative");
    
        //-------------------------------------------------------------------------
        //   Get device features
        //-------------------------------------------------------------------------
        DIDEVCAPS g_joyDevCaps;
    
        g_joyDevCaps.dwSize = sizeof(DIDEVCAPS);
        if (FAILED(hr = g_pJoystick->GetCapabilities(&g_joyDevCaps)))
        Form1->Memo1->Lines->Add("Error: failed getting joystick capabilities");
        else
        Form1->Memo1->Lines->Add("- " + String(g_joyDevCaps.dwButtons) +" joystick buttons available");
    

    Callback

    //-----------------------------------------------------------------------------
    // Name: EnumJoysticksCallback()
    // Desc: Called once for each enumerated joystick.
    //-----------------------------------------------------------------------------
    BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance,
                                         VOID* pContext )
    {
    
        hr = g_pDI->CreateDevice(pdidInstance->guidInstance, &g_pJoystick, NULL );
    
        if(FAILED(hr))
        return DIENUM_CONTINUE;
      else
        return DIENUM_STOP;
    
    }
    

    Das sollte dir weiter helfen 😉
    MSDN ist dein Freund ! geb einfach mal "Joystick" in die MSDN Suche ein 😮



  • In der MSDN-Hilfe steht, dass g_pDI, also mein lpDI ein zeiger auf ein IDIRECTINPUT8-Objekt sein soll, wenn ich dieses Objekt nutze, zeigt der Compiler an, dass er das IDIRECTINPUT8 ein nicht deklarierter Bezeichner ist. Wen ich stattdessen LPDIRECTINPUT8 nutze, sagt der Compiler, dass der linke Teil von ->CreateDevices und ->Enumdevices auf eine Klasse/Struktur/Union zeigen muss. Was ist jetzt noch falsch?



  • Benutze einfach LPDIRECTINPUT und dann #define DIRECTINPUT_VERSION 0x0800



  • dali schrieb:

    Benutze einfach LPDIRECTINPUT und dann #define DIRECTINPUT_VERSION 0x0800

    Das hilft überhauptnicht, erzeugt nur noch nen paar Warnungen zusätzlich...



  • Kampino schrieb:

    In der MSDN-Hilfe steht, dass g_pDI, also mein lpDI ein zeiger auf ein IDIRECTINPUT8-Objekt sein soll, wenn ich dieses Objekt nutze, zeigt der Compiler an, dass er das IDIRECTINPUT8 ein nicht deklarierter Bezeichner ist. Wen ich stattdessen LPDIRECTINPUT8 nutze, sagt der Compiler, dass der linke Teil von ->CreateDevices und ->Enumdevices auf eine Klasse/Struktur/Union zeigen muss. Was ist jetzt noch falsch?

    ⚠
    IDIRECTINPUT8 == COM-Interface
    LPDIRECTINPUT8 == Zeiger auf ein COM-Interface (LP == Long Pointer)
    ⚠



  • Sgt. Nukem schrieb:

    Kampino schrieb:

    In der MSDN-Hilfe steht, dass g_pDI, also mein lpDI ein zeiger auf ein IDIRECTINPUT8-Objekt sein soll, wenn ich dieses Objekt nutze, zeigt der Compiler an, dass er das IDIRECTINPUT8 ein nicht deklarierter Bezeichner ist. Wen ich stattdessen LPDIRECTINPUT8 nutze, sagt der Compiler, dass der linke Teil von ->CreateDevices und ->Enumdevices auf eine Klasse/Struktur/Union zeigen muss. Was ist jetzt noch falsch?

    ⚠
    IDIRECTINPUT8 == COM-Interface
    LPDIRECTINPUT8 == Zeiger auf ein COM-Interface (LP == Long Pointer)
    ⚠

    Uns was davon soll ich jetzt benutzen?



  • Wenn du auf Borland programmierst musst du auch Borland konforme DX Libs verwenden. Habe sie von einer russichen Seite aber frag mich nicht nach dem Link 😕
    Der Pfad mit den Libs muss in den Projekteigenschaften an erster Stelle stehen. Achte darauf das du #define DIRECTINPUT_VERSION 0x0800 nach der DX header deklaration setzt.





  • Ich nutze Visual C++ 6.0. Im oberen post hab ich angepasst, wie mein code jetzt aussieht. Hier nochmal die Ausgabe des Compilers:

    Kompilierung läuft...
    Joystick.cpp
    c:\dxsdk\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
    g:\dateien\cstart\start\joystick.h(6) : warning C4005: 'DIRECTINPUT_VERSION' : Makro-Neudefinition
            c:\dxsdk\include\dinput.h(42) : Siehe vorherige Definition von 'DIRECTINPUT_VERSION'
    g:\dateien\cstart\start\joystick.h(11) : error C2629: 'class Joystick (' unerwartet
    g:\dateien\cstart\start\joystick.h(11) : error C2238: Unerwartete(s) Token vor ';'
    g:\dateien\cstart\start\joystick.h(18) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'lpDI'
    g:\dateien\cstart\start\joystick.h(18) : error C2501: 'IDIRECTINPUT8' : Fehlende Speicherklasse oder Typbezeichner
    g:\dateien\cstart\start\joystick.h(18) : error C2501: 'lpDI' : Fehlende Speicherklasse oder Typbezeichner
    g:\dateien\cstart\start\joystick.cpp(4) : error C2065: 'IDIRECTINPUT8' : nichtdeklarierter Bezeichner
    g:\dateien\cstart\start\joystick.cpp(4) : error C2146: Syntaxfehler : Fehlendes ')' vor Bezeichner 'lp'
    g:\dateien\cstart\start\joystick.cpp(4) : error C2350: 'Joystick::Joystick::Joystick' ist kein statisches Element
    g:\dateien\cstart\start\joystick.cpp(4) : error C2059: Syntaxfehler : ')'
    g:\dateien\cstart\start\joystick.cpp(4) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    g:\dateien\cstart\start\joystick.cpp(4) : error C2447: Funktionskopf fehlt - Parameterliste im alten Stil?
    g:\dateien\cstart\start\joystick.cpp(16) : error C2065: 'lpDI' : nichtdeklarierter Bezeichner
    g:\dateien\cstart\start\joystick.cpp(16) : error C2227: Der linke Teil von '->CreateDevice' muss auf Klasse/Struktur/Union zeigen
    g:\dateien\cstart\start\joystick.cpp(26) : error C2227: Der linke Teil von '->EnumDevices' muss auf Klasse/Struktur/Union zeigen
    Fehler beim Ausführen von cl.exe.
    
    Start.exe - 14 Fehler, 1 Warnung(en)
    

Anmelden zum Antworten