StartTutorialsGame MakerTexteingabe in GMS

Texteingabe in GMS

  • 1 Monat her
  • 4Minuten

Eines der Schwierigkeiten, vor denen Anfänger in GMS stehen, ist die Texteingabe. Etwa für einen Namen. Dieses Problem lässt sich mit einigen Zeilen Code lösen.

Der ganz billige Weg

Mit der Funktion get_string() kann man in GMS ein Fenster anzeigen lassen. Etwa so:

Daraufhin erscheint eine Box, die so aussieht:

get_string
get_string

Damit wären wir schon fertig. Der eingegebene Text wird in der Variable txt_input gespeichert. Doch wir haben gleich drei Probleme:

  1. Wir können mit dieser Methode die erlaubten Zeichen nicht reduzieren.
  2. Wir können min und max der erlaubten Zeichen nicht anpassen.
  3. Das sieht ziemlich billig aus und passt mit Sicherheit nicht zum Spiel.

Was wir wollen, ist eine “richtige” Eingabe im Spiel. Die lässt sich dann beliebig designen, etwa mit einem Fenster drum herum. Um es einfach zu halten, hat dieses Beispiel folgende Funktionen:

  • Der Spieler kann einen Text eingeben.
  • Die erlaubten Zeichen bestehen nur aus Groß- und Kleinbuchstaben.
  • Doppelte Leerzeichen werden entfernt.
  • Ein blinkender Cursor befindet sich hinter dem Text.

Am Ende soll es so aussehen:

Texteingabe in GMS
Texteingabe in GMS

Ausgangslage

Für dieses Beispiel legen wir ein neues Projekt an. Mein Objekt heißt o_input. Die Schrift habe ich f_txt_input genannt. Dahinter verbirgt sich die Schriftart Calibri in der Größe 36. Mehr brauchen wir dieses Mal nicht.

o_input

Event Create

keyboard_string ist eine von Game Maker vorgegebene Variable. Sie enthält eine Zeichenkette mit den letzten (maximal) 1024 Zeichen, die auf der Tastatur eingegeben wurden. Diese Zeichenkette enthält nur druckbare Zeichen, aber sie reagiert korrekt auf das Drücken der Rücktaste, indem sie das letzte Zeichen löscht. Bevor wir also starten, wird diese gelöscht.

txt_input ist unser eingegebener Text. Der kann später weiterverarbeitet werden. Im Beispiel erscheint lediglich eine Textbox.

Die Vatiablen dtime und delete_timer nutzen wir für die Verzögerung, falls der Text oder einzelne Buchstaben mit der Backspace-Taste gelöscht werden sollen.

txt_limit gibt die maximale Anzahl an Zeichen an. txt_min entsprechend die minimale Anzahl. Im Beispiel ist die Eingabe erst korrekt, wenn sie mindestens 3, aber höchstens 16 Zeichen hat.

Mit enable_keys geben wir vor, welche Zeichen erlaubt sind. Im Beispiel sind es Groß- und Kleinbuchstaben, Zahlen sind nicht erlaubt. Das kann man aber beliebig ergänzen.

blink_speed und blink steuern den Cursor. Zuletzt wird der Alarm gestartet, damit dieser laufend an und aus geht.

Event Alarm[0]

Hier schalten wir das Blinken an und aus.

Event Step

Der Code ist in fünf Abschnitte unterteilt. Schauen wir uns das einzeln an.

Texteingabe

Zunächst fragen wir ab, ob eine Taste gedrückt wurde (vk_anykey) und ob der Text kürzer ist als txt_limit. Wenn dem so ist, kommt die nächste Abfrage. Hier schauen wir nach, ob das eingegebene Zeichen (keyboard_string) einem der erlaubten Zeichen (enable_keys) entspricht. Wenn das so ist, Schalten wir den das Blinken immer ein und ergänzen die Variable txt_input um das neue Zeichen. Anschließend wird keyboard_string zurückgesetzt.

Backspace

Wir schauen, ob die Backspace-Taste gedrückt und gehalten wird. D. h. der Spieler kann den Text mit gedrückter Taste löschen. Hinzu kommt die Abfrage von delete_timer.

Ist das erfüllt, wird mit string_delete(txt_input, string_length(txt_input), 1) das letzte Zeichen der Variable txt_input gelöscht. Anschließend setzen wir delete_timer auf 0 und löschen keyboard_string.

Doppelte Leerzeichen löschen

Für solche Aufgaben ist die Funktion string_replace perfekt.

Enter

Neben dem Tastendruck fragen wir noch ab, ob die minimale Zahl der Zeichen erreicht wurde. Ab dann können wir alles mögliche machen. Im Beispiel zeigen wir den Text noch einmal an. Man könnte auch ein Formular mit mehreren Eingaben machen und somit zum nächsten Feld springen. Oder in den nächsten Raum.

Counter für die Zeit zum löschen

Das ist selbstredend. Wir zählen den Counter für die Verzögerung hoch.

Event Draw

Das Anzeigen des Textes ist einfach. Nachdem die ersten fünf Zeilen lediglich Formatierungen sind, wird in Zeile 6 der Text angezeigt. Der Cursor ist schon ein bisschen komplexer.

Wenn blink wahr ist, wird es angezeigt. Die Anzeige selbst unterscheidet zwischen “wir haben einen Text” und “wir haben keinen Text”. Wenn wir keinen Text haben, also strLenght <= 0, dann zeichnen wir den Cursor in der Mitte des Bildschirms. Wenn wir Zeichen haben, kommt ein sog. offsetX-Wert hinzu.

offsetX berechnet sich aus lenght/2+4. Das kann, je nach Schrift und Größe, abweichen. lenght stützt sich auf die Funktion string_width(). Diese Funktion gibt die Breite (in Pixeln) der eingegebenen Zeichenkette zurück. Doch warum teilen wir durch zwei? Weil der Text horizontal zentriert angezeigt wird. D. h. die hälfte er errechneten Pixel wandert auf die andere Seite. Sollte der Text linksbündig sein, entfällt das.

Das war es auch schon. Nun kann man das Ganze ausschmücken. In einem meiner aktuellen Projekte sieht es bspw. so aus:

Textbox in GMS
Textbox in GMS

Rechts ist sogar eine Anzeige für die erlaubte Zeichenlänge. Wenn der Wert < 3 ist, wird es rot angezeigt. Ob die Mailadresse korrekt ist, wird erst bei der Eingabe angezeigt. Wie man das prüft, zeige ich in einem anderen Tutorial.

Hat Dir dieser Artikel gefallen? Dann würden wir uns sehr über Unterstützung freuen.

Sven Gramatke
Sven Gramatke//www.gravitationart.com/
Schreibt gelegentlich Artikel. Schwerpunkte sind Gamedesign, Programmierung (GML, PHP und JS), Retro und Berichte.
Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments

NEWS

Revision 2022

Revision 2022 – Eine Satellitenveranstaltung

0
Wer zu Ostern noch nichts vor hat, sollte über einen Besuch der Revision nachdenken. Diese Demoszene-Party startet am Karfreitag, den 15. April und endet...
news logo 696x400

Revorix Update 1.9

1
Revorix hat ein neues Update bekommen: Patch 1.9 Hauptfeature sind Ressourcen-Events mit der Möglichkeit wechselnde Ressourcen spenden zu können gegen noch zu enthüllende Überraschungen. Außerdem...
news logo 696x400

Godot 3.4.2 veröffentlicht

0
Kurz nach Version 3.4.1 wurde schon 3.4.2 der Spieleengine veröffentlicht. Grund für das schnelle Update war ein Fehler. Bein Rendering unter macOS konnte es...
news logo 696x400

CRYENGINE 5.7 Roadmap enthüllt

0
Nach langer Wartezeit wurde nun die Roadmap für die CRYENGINE 5.7 enthüllt. Crytek räumt dabei interne Schwierigkeiten ein. Intern sind wir bei der Entwicklung auf...
manasoup

Tolle Projekte in der Manasoup-Gamejam

0
Die Manasoup-GameJam ist zu Ende und es gibt viele tolle, unglaubliche Spiele, die man kostenfrei runterladen und spielen kann. Herzlichen Glückwunsch an die Gewinner -...
0
Would love your thoughts, please comment.x
()
x