Erweiterte Gamepad Abfrage

    • Skript

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Erweiterte Gamepad Abfrage

      Der GM bietet bekanntlich Funktionen, die Tastatur auf einen beginnenden, anhaltenden, oder endenden Tastendruck zu prüfen. Kürzlich wurde ich gefragt, ob solche Funktionen auch für Gamepads zur Verfügung stehen. Leider nein - deshalb wollte ich hierfür eigene Events entwickeln. Zwar arbeitet kaum jemand an Spielen mit Controller-Unterstützung, aber ich möchte ich die Scripts trotzdem zur Verfügung stellen. Man weiß ja nie. Credits sind übrigens nicht nötig.

      So funktioniert's:
      Ruft im Create Event eines Objekts (z.B. obj_player) das Init-Script auf - joystick_init_buttons(). In die Klammern kommt die Anzahl der benötigten Buttons (laut GM maximal 32). Im Step Event wird das Main-Script ausgeführt - joystick_get_buttons(). Nun müssen nur noch die neuen Events angelegt werden:

      1. Event für "Tastendruck startet": Klick auf "Add Event" -> "Other" -> "User defined" -> "User 0"
      2. Event für "Tastendruck aktiv": Klick auf "Add Event" -> "Other" -> "User defined" -> "User 1"
      3. Event für "Tastendruck endet": Klick auf "Add Event" -> "Other" -> "User defined" -> "User 2"

      Zum Checken der Buttons gibt es button[id]. Soll also etwas passieren, wenn Button 2 losgelassen wird, muss folgender Code in "User Defined 2":

      GML-Quellcode

      1. // Wenn Button 2 aktiv, dann Aktion ausführen
      2. if(button[2] == true) {
      3. // hier gewünschte Aktion ausführen
      4. }

      Im RAR-Archiv befindet sich eine "example.gmk". Die "empty.gmk" ist für einen Schnellstart vorbereitet.

      Anmerkungen:
      1. Es ist leider nicht möglich, für jeden einzelnen Button alle 3 Events anzulegen, da nur 16 User Events zur Verfügung stehen.
      2. Gamepads sind von Hersteller zu Hersteller unterschiedlich belegt. Der A-Button der Xbox 360 entspricht button[1]. Es kann sein, dass button[1] bei anderen Gamepads anderen Buttons entspricht. Soll immer der Button an dieser Stelle für bestimmte Aktionen stehen, lasst den Spieler die Buttonbelegung einstellen.

      Ich würd mich freuen, wenn die Scripts Verwendung finden und im Übrigen würde ich wirklich gern mal gute GM Spiele relaxed mit Controller zocken. :)
      Für Fragen stehe ich gern zur Verfügung. Viel Spaß!
      Dateien
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mauge ()

    • Also wenn ich das jetzt richtig verstanden habe, ist der Code um zu gucken ob ein Taste eines
      Gamepad gedrückt wird. Richtig?
      Diese Funktion gibt es doch aber bei GM!
      Unter Add Event > Mouse > Joystik 1/2
      oder ist das was anderes?

      Ich bin keine Signatur... Ich putze hier nur!
    • Ja, denn er checkt wie Keyboard/Press/Release ob die Taste unten ist, in diesem Step gedrückt oder losgelassen wurde.

      Ich finds toll, genau das, was ich brauchte. Vielen Dank!
      <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
      <Irrenhaus3>da geht alles in Deckung
    • Ich hab eigentlich gar keine Antworten erwartet, weil die Scripts ja doch für die meisten eher uninteressant sind. Danke euch erstmal!

      @KröteGAMES: Jetzt hast du mir aber grad einen riesigen Schrecken eingejagt! Als ich deine Antwort gelesen hab, musste ich erstmal schell im GM nachschauen, ob meine ganze Arbeit umsonst war. :D

      @Superyoshi: Freut mich, dass die Scripts direkt Verwendung finden! Kommst du soweit zurecht oder ist irgendwas unklar?

      Da mein Text oben vielleicht doch nicht so verständlich war... der GM bietet für Tastaturabfragen u.a. folgende Funktionen:
      keyboard_check(key) Gibt an, ob die Taste mit dem angegebenen keycode momentan gedrückt ist.
      keyboard_check_pressed(key) Gibt an, ob die Taste mit dem angegebenen keycode seit dem letzten step gedrückt wurde.
      keyboard_check_released(key) Gibt an, ob die Taste mit dem angegebenen keycode seit dem letzten step losgelassen wurde.

      Leider gibt es diese Funktionen für Joystick- und Controllerabfragen nicht. Meine Scripts sorgen einfach nur dafür, dass man dennoch über diese Möglichkeiten verfügt. Zwar geschieht das über einen kleinen Umweg, aber möglichst einfache Bedienung für den User stand im Vordergrund.


      Mir ist grad noch aufgefallen, dass man mit den Scripts dummerweise nur einen Controller abfragen kann. Aber ich denk mal, es ist für die meisten kein Problem, das System auf 2 Controller zu erweitern. Es ist ja relativ wenig Code und kompliziert ist es eigentlich auch nicht. Ich weiß noch nicht, ob ich in nächster Zeit selbst dazu komme.
      Noch was - ich hab leider keinen GM6. Gibt es wen, der die ganze Sache ins gm6 Format bringen kann?
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • copyboy schrieb:

      Sicherlich ganz hilfreich, aber ich verstehe nicht ganz, warum du User Events benutzt. Könnte man den Status der Buttons nicht einfach in globalen Variablen/Arrays speichern und ähnliche Funktionen machen, wie die zur Überprüfung der Tastatur? ( joystick_check... )

      Klar, hätte man machen können, aber mir gefällt es mit den User Events besser, weil alles eindeutig zu erkennen ist. Letztenendes ist es doch nur Formsache.
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Ich muss zu meiner Schande gestehen, dass ich nicht riengeschaut hab, weil ich mir einbilde, dass ich weiß, wie du es gemacht hast, aber wenn ich das richtig sehe, umgehst du das Problem der doppelten Ausführung nicht.

      Will heißen, dass man auf dem Gamepad und auf der Tastatur die Tasten für die gleiche Funktion gleichzeitig drückt, diese Funktion unter Umständen gleich 2mal im selben Step ausgeführt wird, richtig?
    • MewX schrieb:

      Will heißen, dass man auf dem Gamepad und auf der Tastatur die Tasten für die gleiche Funktion gleichzeitig drückt, diese Funktion unter Umständen gleich 2mal im selben Step ausgeführt wird, richtig?


      Wenn ich dich richtig verstehe, wird die Abfrage sogar noch öfter ausgeführt. In jedem Step wird das Hauptscript ausgeführt, welches 3 Abfragen in einer for-Schleife ausführt. Vermutlich ist es ziemlich primitiv umgesetzt - bin aber auch kein guter Programmierer. Wie ghost (und auch ich nun schon mehrfach) sagte, geht es nur darum, 3 Events dafür bereitzustellen. Ich hatte anfangs auch copyboy's Idee im Sinn, hab mich dann aber hierfür entschieden, weil ich es gerade für Anfänger simpler finde.

      Ehrlich gesagt weiß ich gar nicht, was du mit der "doppelten Ausführung" meinst. Falls du es darauf beziehst, dass man in den User Events noch eine zusätzliche Abfrage der Buttons ausführen muss, muss ich sagen, dass diese einzelne Zeile trotzdem noch einiges an Arbeit spart. Dies würde natürlich wegfallen, wenn man statt der User Events nur 3 Scripts hätte. Viele Einsteiger wissen vermutlich gar nicht, wo sie ansetzen müssten, um herauszufinden, wann ein Tastendruck beginnt oder endet. Bei meinen Überlegungen bin ich deshalb zu dem Schluss gekommen, dass dies wohl die einsteigerfreundlichste Variante ist. Für erfahrene User war das Ganze ohnehin nie gedacht, da sie für sowas wohl eigene Techniken entwickeln. Würde ich - wie unschwer zu erkennen - auch tun. ^^

      Die Meinungen gehen hier wohl arg auseinander. Ich persönlich halte es für unnötige Haarspalterei. Natürlich freue ich mich über Kritik - sei sie noch so niederschmetternd - aber konstruktiv sollte sie sein. Worum es mir ging, wurde nun zur Genüge geklärt. Wenn ihr es optimieren wollt, tut euch keinen Zwang an, aber akzeptiert, dass ich mich (mehr als ausreichend begründet) für diesen Weg entschieden hab. Nutzt die Scripts oder lasst es - mir ist's egal. :)
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Benutzer online 1

      1 Besucher