Joystickprogrammierung



  • hi!

    wie bzw. über welche API kann ich auf den Joystick zugreifen? Oder wie kann man das über DirectInput/DirectX realisieren? Bräuchte auch Quellcode in MSVC. Kann mir da jemand weiterhelfen???

    cu todo



  • Das kann man auch über DirectInput machen :). Den Quellcode gibt's gleich ;).

    cya 🙂



  • Also, hier der Code :):

    // ...
    
    // der Wert für die X- und Y-Achse wird jeweils auf 1000 gesetzt
    // sobald der Joystick eine Position, die 1/3 in eine Richtung
    // abweicht einnimmt, wird dies als Bewegung interpretiert
    #define JOY_TOLERANCE 333
    
    #define MOVE_LEFT      1
    #define MOVE_RIGHT     2
    #define MOVE_UP        4
    #define MOVE_DOWN      8
    #define MOVE_FIRE     16
    
    // ...
    
    int InputManager::getJoystickInput(void)
    {
        int JoystickInput = 0;
    
        DIJOYSTATE2 JoystickState;
    
        // Poll aufrufen, um Daten abfragen zu können
        if(FAILED(lpDIDevice->Poll()))
        {
            // wenn ein Fehler auftriff, Joystick zurückfordern
            lpDIDevice->Acquire();
            return 0;
        }
    
        // Joystick-Status (Achsenposition, Knöpfe,... abfragen)
        lpDIDevice->GetDeviceState(sizeof(JoystickState),&JoystickState);
    
        // der Wert für die X- und Y-Achse wird jeweils auf 1000 gesetzt
        // sobald der Joystick eine Position, die 1/3 (333 = TOLERANCE)
        // in eine Richtung abweicht einnimmt, wird dies als Bewegung interpretiert
    
        if(JoystickState.lX < -JOY_TOLERANCE)
        {
            JoystickInput += MOVE_LEFT;    
        }
        else if(JoystickState.lX > JOY_TOLERANCE)
        {
            JoystickInput += MOVE_RIGHT;
        }
    
        if(JoystickState.lY < -JOY_TOLERANCE)
        {
            JoystickInput += MOVE_UP;        
        }
        else if(JoystickState.lY > JOY_TOLERANCE)
        {
            JoystickInput += MOVE_DOWN;
        }
    
        // testen, ob ein Knopf gedrückt wurde
        for(int i=0;i<128;i++)
        {
            if(JoystickState.rgbButtons[i])
            {
                JoystickInput += MOVE_FIRE;
                break;
            }
        }
    
        return JoystickInput;
    }
    
    // ...
    
    BOOL InputManager::initJoystick(HWND hWnd)
    {
        GUID JoyGUID;
        if(FAILED(lpDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoystickCallback,
                                    &JoyGUID, DIEDFL_ATTACHEDONLY)))
        {
           return Error("Fehler beim Abzählen der Eingabegeräte"
                        "keine Joysticks vorhanden ?");        
        }
    
        // Versuchen den Joystick einzurichten,
        if(FAILED(lpDI->CreateDevice(JoyGUID,&lpDIDevice, NULL)))
        {
           return Error("Fehler beim Anlegen des Geräts (Joystick)");
        }
    
        // c_dfDIJoystick2 ist eine vordefinierte Variable
        if(FAILED(lpDIDevice->SetDataFormat(&c_dfDIJoystick2)))
        {
            return Error("Fehler beim Setzen des Datenformats");        
        }
    
        // Kooperationsebene festlegen - Joystickeingaben sind nur für dieses
        // Programm bestimmt und können exklusiv nur für dieses Programm genutzt werden.
        if(FAILED(lpDIDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | 
                                                       DISCL_EXCLUSIVE)))
        {    
            return Error("Fehler beim Setzen des Kooperationsebene (DirectInput)");        
        }
    
        // Joystick-Bereich bestimmen
        DIPROPRANGE JoystickRange;
        ZeroMemory(&JoystickRange,sizeof(JoystickRange));            
        JoystickRange.diph.dwSize       = sizeof(JoystickRange); 
        JoystickRange.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
    
        // Setzen der Werte für die X-Achse
        JoystickRange.diph.dwObj        = DIJOFS_X;
        JoystickRange.diph.dwHow        = DIPH_BYOFFSET; 
        JoystickRange.lMin              = -1000; 
        JoystickRange.lMax              =  1000; 
    
        // DIPROP_RANGE - Bereich der Achsen
        if(FAILED(lpDIDevice->SetProperty(DIPROP_RANGE, &JoystickRange.diph)))
        {
            return Error("Fehler beim Setzen der Joystickeigenschaften (X-Achse)");
        }
    
        // Setzen der Werte für die Y-Achse (gleiche Werte wie für X)
        JoystickRange.diph.dwObj        = DIJOFS_Y;
    
        if(FAILED(lpDIDevice->SetProperty(DIPROP_RANGE, &JoystickRange.diph)))
        {
            return Error("Fehler beim Setzen der Joystickeigenschaften (Y-Achse)");
        }
    
        // Zugang zum Joystick verschaffen
        lpDIDevice->Acquire();
    
        return TRUE;
    }
    
    // ...
    

    Ich hoffe die Sachen erklären sich von selbst :), hab's jetzt nur schnell aus JLI Spieleprogrammierung mit DirectX und VisualC++ kopiert ;).

    cya 🙂



  • wie ist das mit directx? muss ich das erst noch irgendwie initialisieren oder so? und welche include-files muss ich benutzen bzw. wo bekomm ich die her, wenn die beim MSVC nicht dabei sind? ich kenn mich auf dem gebiet überhaupt (noch) nicht aus...

    aber trotzdem schonmal danke für den code!

    cu todo



  • Dann solltest du dir erst mal ein paar Tutorials/Bücher reinziehen :). Schau mal auf www.zfx.info oder in die Spiele/Grafik-Programmierung-FAQ.

    cya 🙂


Anmelden zum Antworten