maddin Geschrieben 12. Oktober 2001 Geschrieben 12. Oktober 2001 hallo, ich habe mal wieder eine frage. diesmal zum thema direct input. und zwar habe ich ein programm, welches den status (button gedrückt, ...) eines joysticks (in meinem fall pcdash2) abfragen soll. ich habe es soweit geschaft bis zu der funktion CreateDevice. zumindest liefer mir diese DI_OK. nun aber möchte ich abfragen, ob ein button gedrückt wurde, ... . nach nun mehr zwei tagen des versuchens und raten habe ich gedacht und frage einmal ob vielleicht einer von euch weiß, wie ich abfragen kann, ob ein button gedrückt wurde. Zitieren
Crush Geschrieben 12. Oktober 2001 Geschrieben 12. Oktober 2001 Also ich habe sowas zwar noch nicht programmiert, aber mich hat das interessiert, weil ich auch bald in OpenGL und/oder DirectX etwas rumprogrammieren will und so habe ich mich ein wenig schlau gemacht: joySetCapture() frägt nur 3-Achsen Joysticks ab und erlaubt keine erweiterten Geräte-> aber hier wird das Fenster bei Joystickänderungen mit aktuellen echtezeite-States und Messages vollgepumpt. Soweit möglich sollte man diese Abfragemöglichkeit nicht verwenden. Laut DX-Developers. Da bei 3D-Spielen nicht immer flüssigen Frameraten erreicht werden, bwz. diese ständig variieren sollte man lieber den Joystick "pollen" mit folgender Funktion: joyGetPosEx() supported bis 32 Buttons, 6 Achsen und POV-Head für digitale und analoge Devices. WINMM.LIB und MMSYSTEM.H müssen erst mal included werden. joyGetPosEx(JOYSTICKID1); // Initialisierung JOYINFOEX joyInfoEx; ZeroMemory(joyInfoEx, sizeof(joyInfoEx); joyInfoEx.dwSize = sizeof(joyInfoEx); BOOL JoyPresent = (joyGetPosEx(JOYSTICKID1, &joyInfoEx) == JOYERR_NOERROR); //Abfragen ob überhaupt Treiber oder Joystick vorhanden sind Calibrieren des Joysticks: WinExec("control joy.cpl," SW_NORMAL); Die "Dead Zone" ist ein im Ruhe-Bereich des Joysticks in dem man "gerade fliegt" oder halt "steht" . Die Joysticks sind jedoch so empfindlich, daß man einen größeren Bereich als Dead-Zone definieren muß, damit die Figur nicht wie wild hin- und her-zittert. Das JOY_USEDEADZONE-Flag wird automatisch von joyGetPosEx() mit einem normalwert initialisiert. Ansonsten muß man halt einfach eine Bereichsabfrage machen und diese aus den Polls rausrechnen, damit innerhalb der Dead-Zone alle Polls rausgefiltert werden und keine Aktionen auslösen. REGSTR.H muß für eigenständige Kalibrierung included sein. JOYCAPS joyCaps; JOYINFOEX joyInfoEx; ZeroMemory(joyInfoEx, sizeof(joyInfoEx); joyGetDevCaps(JOYSTICKID1, &joyCaps, sizeof(joyCaps)); BOOL JoyHasThrottle = (joyCaps.wCaps & JOYCAPS_HASZ); if (JoyHasThrottle){ joyInfoEx.dwSize = sizeo(joyInfoEx); joyInfoEx.dwFlags=JOY_RETURNZ; joyGetPosEx(JOYSTICKID1, &joyInfoEx);} joyInfoEx.dwZpos übergibt nun die Joy-Position. Die relative Position wird berechnet aus joyCaps.wZmin und joyCaps.wZmax Man kann JOY_RETURNZ mit anderen Flags "or-en" (Position, Button-states, usw.) in einem einzigen Aufruf bekommt man alle Ergebnisse auf EINMAL! Es ist nicht nur möglich X,Y und Z abfragen, sondern auch noch R für Ruder (Paddle), U und V (für Fußpedalen, drehbare Joysticks (Griff drehbar nach links und rechts), frei definierte Sliders, Knöpfe und was die Hardware-Produzenten den Pads und Joysticks so mitgegeben haben). Nicht aber den POV. Die Position des Helms wird über JOYINFOEX.dwPOV abgefragt. (Aber ehrlich: Wer hat denn schon so einen blödsinnigen Helm?) Irgendwie habe ich zwar noch das Gefühl, als ob die Zeitinformationen bei den Polls fehlen, aber die sind bestimmt in der JOYINFOEX.sonstwas versteckt oder halt in irgendeiner Get()-Routine abfragbar. Wie gesagt, habe ich halt das SDK noch nicht installiert und mich mit DirectInput noch gar nicht beschäftigt (ist in meiner Literatur auch nirgendwo brauchbar behandelt). Hoffentlich bringt´s Dir was. <FONT COLOR="#a62a2a" SIZE="1">[ 12. Oktober 2001 16:42: Beitrag 2 mal editiert, zuletzt von Crush ]</font> Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.