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