Textbox (Eingabe) >2<

    • Skript

      Textbox (Eingabe) >2<

      Hier will ich euch mein Textbox Script vorstellen, dass ich aufgrund Anfragen und nicht Idealster Lösung geschrieben habe. Obwohl Textboxen sehr Wichtig sind, greifen die meisten auf get_string zu. Es gibt zwar schon einige Textboxen Scripte aber diese benutzen dann meist keyboard_string, was drei Nachteile hat: 1. Man kann nicht in der Mitte des Textes schreiben 2. Es kann nur eine einzige Textbox verwendet werden 3. Es enthält alle zuletzt getippten Zeichen(Kann man Theoretisch umgehen).
      Welche Vorteile hat dieses Script:
      • Es hat einen Focus
      • Man Kann an einer beliebigen Stellen schreiben. Kann mit dem Pfeiltasten und mit der Maus :!: gewählt werden.
      • Man kann den Text Kopieren, Ausschneiden, Einfügen(An der Stelle des Zeigers).
      • Automatische Anpassung der Textbox.
      • Beliebige Anzahl an Textboxen(Für jede ein Objekt da sie sich keine Variable teilen können.)
      Es ist sehr leicht in der Anwendung. Einfach ein neues Script erstellen, den unteren Script hineinkopieren (strg+c strg+v), den Script draw_textbox nennen und schon kann man ihn wie jede andere Funktion verwenden.
      Die Argumente sind wie folgt(Auch als Komentar im Script):
      argument0 | X Position(Standard x)
      argument1 | Y Position(Standard y)
      argument2 | Grafik der Textbox
      argument3 | Maximale Textlänge
      argument4 | Voreingestellter Text


      Mit Strg+X / Strg+C / Strg+V lässt sich wie gewohnt der Text ausschneiden/kopieren und einfügen.

      Als Rückgabe Wert wird der Text ausgegeben (Eigentlich sinnlos da die Variable TEXT den text schon beinhaltet).

      Script:
      Alt:
      Spoiler anzeigen

      GML-Quellcode

      1. //////////////////////////////////////////////////
      2. // Mit diesem Script kannst du eine //
      3. // Textbox drawen lassen und //
      4. // deren Wert Einlesen //
      5. //////////////////////////////////////////////////
      6. /////////////// Made by Chris987 /////////////////
      7. // Argumente //
      8. /*
      9. Flag 0 | Die X Position
      10. Flag 1 | Die Y Position
      11. Flag 2 | Die Textbox Grafik
      12. Flag 3 | Maximale Zeichen
      13. Flag 4 | Voreingestellter Text
      14. */
      15. ///////////// Variablen Vorbereiten //////////////
      16. if not(variable_local_exists("TEXT")) //Prüft ob schon der Text vorhanden ist.
      17. TEXT = argument4 //Erstelle eine Var mit dem voreingestellten Text.
      18. if not(variable_local_exists("FOCUS")) //Prüft ob schon ein Focus zugewiesen wurde.
      19. FOCUS = false //Erstelle eine Var mit dem Wert false.
      20. if not(variable_local_exists("ZEIGER"))//Prüft ob der Zeiger schon existiert.
      21. ZEIGER = 0 //Setze den Zeiger auf 0.
      22. if not(variable_local_exists("backspace_friction"))//Prüft ob der Zeiger schon existiert.
      23. backspace_friction = 0 //Setze den Zeiger auf 0.
      24. ////////////// Eingabe und Zeugs /////////////////
      25. if(mouse_check_button(mb_any)) //Checkt ob eine Maustaste gedrückt wird.
      26. if(mouse_x > argument0 and mouse_x < argument0 + string_width(string_repeat('A',argument3)) and //Prüft ob sich die Maus(X) im Bereich befindet.
      27. mouse_y > argument1 and mouse_y < argument1 + string_height('A')){ //Prüft ob sich die Maus(Y) im Bereich befindet.
      28. FOCUS = true //Der Focus wird aktiviert
      29. var i;
      30. for(i=0;i<=string_length(TEXT);i+=1)//Durchgeht die Buchstaben um herauszufinden wo der Zeiger gesetzt wird.
      31. {
      32. if(i==string_length(TEXT))
      33. ZEIGER = i
      34. else
      35. {
      36. //if(mouse_x+(string_width(string_char_at(TEXT,i+1))/2) >= string_width(string_copy(TEXT,0,i))+argument0)//Nach dem
      37. if(mouse_x+(string_width(string_char_at(TEXT,i))/2) <= string_width(string_copy(TEXT,0,i+1))+argument0)//Vor dem
      38. {
      39. ZEIGER = i //Dann RICHTIG
      40. break;
      41. }
      42. }
      43. }
      44. }
      45. else
      46. FOCUS = false //Der Focus wird deaktiviert
      47. if(FOCUS){ //Wenn der Focus Aktiv ist dann kann der Text eingegeben werden.
      48. if(keyboard_check(vk_control)) //Wenn strg gedrückt wird...
      49. if(keyboard_check_pressed(vk_anykey)) //Ist dazu da dass es nur einmal passiert wenn man eine Taste drückt.
      50. switch(keyboard_key)
      51. {
      52. case ord('C'): clipboard_set_text(TEXT) break; //Text in die Zwischenablage kopieren.
      53. case ord('V'): if(clipboard_has_text())
      54. {
      55. TEXT = string_insert(clipboard_get_text(),TEXT,ZEIGER+1);
      56. ZEIGER += string_length(clipboard_get_text()); break; //Text aus der Zwischenablage am Zeiger einfügen.
      57. }
      58. case ord('X'): clipboard_set_text(TEXT); TEXT = ""; ZEIGER = 0 break; //Text wird Ausgeschnitten
      59. }
      60. //Löscht den Text durch drücken von entf.
      61. if(keyboard_check_released(vk_delete))
      62. {
      63. TEXT = ""
      64. ZEIGER = 0
      65. }
      66. //Bewegt den Zeiger nach links.
      67. if(keyboard_check_pressed(vk_left))
      68. if not(ZEIGER<=0)
      69. ZEIGER -= 1
      70. //Bewegt den Zeiger nach Rechts.
      71. if(keyboard_check_pressed(vk_right))
      72. if not(ZEIGER>=string_length(TEXT))
      73. ZEIGER += 1
      74. if not(keyboard_check(vk_control))
      75. if(keyboard_check_pressed(vk_anykey))
      76. if((keyboard_key >= 48 and keyboard_key <= 90) or keyboard_check(vk_space) or (keyboard_key >= 186 and keyboard_key <= 222))//Gültige Werte
      77. if not(string_length(TEXT) >= argument3)
      78. {
      79. TEXT = string_insert(keyboard_lastchar,TEXT,ZEIGER+1)//Schreibt den Buchstaben an der Position des Zeigers
      80. ZEIGER += 1
      81. }
      82. if(keyboard_check(vk_backspace))
      83. if not(ZEIGER == 0)
      84. {
      85. backspace_friction += 1
      86. if(backspace_friction >= room_speed / 9 or keyboard_check_pressed(vk_backspace))
      87. {
      88. TEXT = string_delete(TEXT,ZEIGER,1)//Löscht das Zeichen an der Position des Zeigers.
      89. ZEIGER -= 1
      90. backspace_friction = 0
      91. }
      92. }
      93. if(keyboard_check_released(vk_backspace))
      94. backspace_friction = 0
      95. }
      96. //////////// Textbox wird gezeichnet //////////////
      97. draw_sprite_stretched(argument2,FOCUS,argument0,argument1,string_width(string_repeat('A',argument3)),string_height('A'))
      98. draw_text(argument0,argument1,string_replace_all(TEXT,"#","\#"))
      99. if(FOCUS)
      100. draw_line(string_width(string_copy(TEXT,0,ZEIGER))+argument0,argument1,string_width(string_copy(TEXT,0,ZEIGER))+argument0,argument1+string_height('ß'))
      101. //Und zum Schluss den Text Zurückgeben lassen(Was eigentlich Total Sinnlos ist)
      102. return TEXT;

      Neu:

      GML-Quellcode

      1. //////////////////////////////////////////////////
      2. // Mit diesem Script kannst du eine //
      3. // Textbox drawen lassen und //
      4. // deren Wert Einlesen //
      5. //////////////////////////////////////////////////
      6. /////////////// Made by Chris987 /////////////////
      7. // Argumente //
      8. /*
      9. Flag 0 | Die X Position
      10. Flag 1 | Die Y Position
      11. Flag 2 | Die Textbox Grafik
      12. Flag 3 | Maximale Zeichen
      13. Flag 4 | Voreingestellter Text
      14. */
      15. ///////////// Variablen Vorbereiten //////////////
      16. if not(variable_local_exists("TEXT")) //Prüft ob schon der Text vorhanden ist.
      17. TEXT = argument4 //Erstelle eine Var mit dem voreingestellten Text.
      18. if not(variable_local_exists("FOCUS")) //Prüft ob schon ein Focus zugewiesen wurde.
      19. FOCUS = false //Erstelle eine Var mit dem Wert false.
      20. if not(variable_local_exists("ZEIGER"))//Prüft ob der Zeiger schon existiert.
      21. ZEIGER = 0 //Setze den Zeiger auf 0.
      22. if not(variable_local_exists("Blink"))//Prüft ob Blink schon existiert.
      23. Blink = true //Setze Blink auf 0.
      24. if not(variable_local_exists("TMBL"))//Prüft ob Blink schon existiert.
      25. TMBL = 0 //Setze Blink auf 0.
      26. if not(variable_local_exists("backspace_friction"))//Prüft ob der Zeiger schon existiert.
      27. backspace_friction = 0 //Setze den Zeiger auf 0.
      28. ////////////// Eingabe und Zeugs /////////////////
      29. if(mouse_check_button(mb_any)) //Checkt ob eine Maustaste gedrückt wird.
      30. if(mouse_x > argument0 and mouse_x < argument0 + string_width(string_repeat('A',argument3)) and //Prüft ob sich die Maus(X) im Bereich befindet.
      31. mouse_y > argument1 and mouse_y < argument1 + string_height('A')){ //Prüft ob sich die Maus(Y) im Bereich befindet.
      32. FOCUS = true //Der Focus wird aktiviert
      33. var i;
      34. for(i=0;i<=string_length(TEXT);i+=1)//Durchgeht die Buchstaben um herauszufinden wo der Zeiger gesetzt wird.
      35. {
      36. if(i==string_length(TEXT))
      37. ZEIGER = i
      38. else
      39. {
      40. //if(mouse_x+(string_width(string_char_at(TEXT,i+1))/2) >= string_width(string_copy(TEXT,0,i))+argument0)//Nach dem
      41. if(mouse_x+(string_width(string_char_at(TEXT,i))/2) <= string_width(string_copy(TEXT,0,i+1))+argument0)//Vor dem
      42. {
      43. ZEIGER = i //Dann RICHTIG
      44. break;
      45. }
      46. }
      47. }
      48. }
      49. else
      50. FOCUS = false //Der Focus wird deaktiviert
      51. if(FOCUS){ //Wenn der Focus Aktiv ist dann kann der Text eingegeben werden.
      52. if(keyboard_check(vk_control)) //Wenn strg gedrückt wird...
      53. if(keyboard_check_pressed(vk_anykey)) //Ist dazu da dass es nur einmal passiert wenn man eine Taste drückt.
      54. switch(keyboard_key)
      55. {
      56. case ord('C'): clipboard_set_text(TEXT) break; //Text in die Zwischenablage kopieren.
      57. case ord('V'): if(clipboard_has_text())
      58. {
      59. TEXT = string_insert(clipboard_get_text(),TEXT,ZEIGER+1);
      60. ZEIGER += string_length(clipboard_get_text()); break; //Text aus der Zwischenablage am Zeiger einfügen.
      61. }
      62. case ord('X'): clipboard_set_text(TEXT); TEXT = ""; ZEIGER = 0 break; //Text wird Ausgeschnitten
      63. }
      64. //Löscht den Text durch drücken von entf.
      65. if(keyboard_check_released(vk_delete))
      66. {
      67. TEXT = ""
      68. ZEIGER = 0
      69. }
      70. //Bewegt den Zeiger nach links.
      71. if(keyboard_check_pressed(vk_left))
      72. if not(ZEIGER<=0)
      73. ZEIGER -= 1
      74. //Bewegt den Zeiger nach Rechts.
      75. if(keyboard_check_pressed(vk_right))
      76. if not(ZEIGER>=string_length(TEXT))
      77. ZEIGER += 1
      78. if not(keyboard_check(vk_control))
      79. if(keyboard_check_pressed(vk_anykey))
      80. if((keyboard_key >= 48 and keyboard_key <= 90) or keyboard_check(vk_space) or (keyboard_key >= 186 and keyboard_key <= 222))//Gültige Werte
      81. if not(string_length(TEXT) >= argument3)
      82. {
      83. TEXT = string_insert(keyboard_lastchar,TEXT,ZEIGER+1)//Schreibt den Buchstaben an der Position des Zeigers
      84. ZEIGER += 1
      85. }
      86. if(keyboard_check(vk_backspace))
      87. if not(ZEIGER == 0)
      88. {
      89. backspace_friction += 1
      90. if(backspace_friction >= room_speed / 9 or keyboard_check_pressed(vk_backspace))
      91. {
      92. TEXT = string_delete(TEXT,ZEIGER,1)//Löscht das Zeichen an der Position des Zeigers.
      93. ZEIGER -= 1
      94. backspace_friction = 0
      95. }
      96. }
      97. if(keyboard_check_released(vk_backspace))
      98. backspace_friction = 0
      99. }
      100. ///////// Bringt den Zeiger zum Blinken ///////////
      101. TMBL += 1
      102. if(TMBL >= 15)
      103. {
      104. TMBL = 0
      105. if Blink
      106. Blink = false
      107. else
      108. Blink = true
      109. }
      110. //////////// Textbox wird gezeichnet //////////////
      111. draw_sprite_stretched(argument2,FOCUS,argument0-2,argument1-2,string_width(string_repeat('a',argument3)),string_height('A')+4)
      112. draw_text(argument0,argument1,string_replace_all(TEXT,"#","\#"))
      113. if(FOCUS)
      114. if(Blink)
      115. draw_line(string_width(string_copy(TEXT,0,ZEIGER))+argument0,argument1,string_width(string_copy(TEXT,0,ZEIGER))+argument0,argument1+string_height('ß'))


      Neuerungen:
      Löschen der Buchstaben lassen sich nun auch durch gedrückt halten der Backspacetaste.
      Grafik ändert sich jetzt durch den Focus. Falls es eine Animation bleiben soll, ersetze in Line 130 FOCUS durch -1.

      Der Script ist zwar noch in Entwicklung, kann aber schon richtig verwendet werden. Und ich rate ab # zu schreiben, es wird zwar angezeigt aber es geschehen dann seltsame Dinge (Ich hab da so eine Vermutung).
      Und zum Schluss noch ein einfaches Beispiel für ein Passwortprogramm. (Erneuert)

      Für Fragen, Wünsche, Kommentare bin ich gerne bereit. ;)

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Chris987“ () aus folgendem Grund: Script Erneuerung

      Gutes Script, auch wenn ich noch keine Anwendungsmöglichkeit weiß. Bei deinem Beispiel fehlt in Zeile 108 bei draw_text das dritte Argument. Wenn du noch mehrzeiligkeit einfügst und das man beim Textlöschen Backspace nicht ganz oft drücken, sondern halten kann, ist es perfekt.
      Ups... Da wollte ich wohl das noch schnell mit dem # ändern. :S Ich habe es jetzt Aktuelisiert. Das mit dem Backspace will ich noch ändern, da es sonst zu empfindlich reagieren würde. Mehrzeiliger Text mache ich vieleicht, würde aber dann ein neues Script erstellen, da dies nur für eine Zeile bestimmt ist.
      Wow...klasse.. :thumbsup:
      Du könntest vielleicht noch einbauen, das Return den Focus wieder deaktiviert, die Entf.-Taste nicht den gesamten Text löscht und das der Zeiger blinkt, nur so als
      Vorschlag :) ..hat ja jeder andere Wünsche an so eine Textbox...ich z.b. habe dazu noch eingestellt das der Mauszeiger verschwindet, wenn FOCUS true ist :)
      Ich schliesse mich Chaos Creator an, ist wirklich ein super Script..danke :!:
      Hallo. :thumbsup:

      Ich denke das ist ein sehr gutes script. Hab aber Probleme mit deinem argument2. Bekomm immer eine Fehlermeldung wenn ich nicht einen Font_namen eingebe, und dann bekomm ich irgendwelche Grafiken aus meinem Spiel als BG gestretcht.

      Habs im Draw-event drinne. Gehört es da nicht hin? Kannst mal ein Beispiel machen was ein name für dieses Argument2 sein könnte und wo sich diese Grafik befinden muss? Checks nicht!!

      Gruss Wildor
      Aktuelles Game: "Pikslar" mit Online Hiscore





      PS: Will mit dieser Frage mal fragen, ob jemand zur zeit, Zeit hat. Suche Grafiker/Pixler










      Im argument 2 gibt man die Grafik an, welches als Textboxgrafik gezeichnet wird. Die Grafik muss ein Sprite sein(Also keine Fonts, Backgrounds, oder externe Grafiken). Gib einfach den Namen dieses Sprites ein. Die Schriftart ist die welche man gerade verwendet. Und ja, das Script kommt ins draw event :event_draw: rein. Wenn es noch immer Probleme geben sollte, versuche es mit den alten Script.
      Kann es sein das dort kein Grafikname mit unterstrich stehen darf?

      z.B. ship_next

      Oder soll man bei Grafiken nie mit Unterstrich arbeiten?
      Aktuelles Game: "Pikslar" mit Online Hiscore





      PS: Will mit dieser Frage mal fragen, ob jemand zur zeit, Zeit hat. Suche Grafiker/Pixler










      Doch, das macht eigentlich jeder und ist btw. neben Groß-Kleinschreibung die einzige möglichkeit Ressourcen Namen zu geben, die aus mehreren wörtern bestehen welche voneinander Getrennt sind und so besser lesbar werden.

      Puh was ein satz :D
      Warum bekom ich bei "score_mouse" ne Fehlermeldung aber bei einem unsichtbaren sprite genannt "no" keine?
      Aktuelles Game: "Pikslar" mit Online Hiscore





      PS: Will mit dieser Frage mal fragen, ob jemand zur zeit, Zeit hat. Suche Grafiker/Pixler










      das wird wohl in der Fehlermeldung stehen. Ich denke es wäre vorteilhaft die Fehlermeldung einmal zu Gesicht bekommen. Ich schätze du hast dich aber vertippt:
      anstatt score_mouse vl score-mouse oder socre_mouse? kann durchaus vorkommen, besonders wenn man es eilig hat ;)
      i think, therefore 私 は.
      Bekomme fehler:

      ERROR in
      action number 3
      of Draw Event
      for object txtbox:

      Trying to draw non-existing sprite.

      Ändere ich den Namen in "score_mouses" (Sprite u. Arg2) dann gehts. Ändere ich den Namen zurück, kommt der Fehler wieder. Liegt wohl am GM!



      Aussedem bekomme ich Argument4 auch nicht hin:

      ERROR in
      action number 3
      of Draw Event
      for object txtbox:

      Error in expression:MAGICMAN
      position 1: Unknown variable MAGICMAN

      EDIT: Mann muss Text in "" eingeben. Oh man!!
      Aktuelles Game: "Pikslar" mit Online Hiscore





      PS: Will mit dieser Frage mal fragen, ob jemand zur zeit, Zeit hat. Suche Grafiker/Pixler










      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wildor“ ()

      Textbox etwas abgeändert auch für GM5 tauglich

      Habe das Script in einige meiner Schreibübungen mit GM8.0 erfolgreich eingebaut. :D Ein großes DANKE für diesen Beitrag.

      Da ich dies auch mit GM8.1 verwirklichen möchte, gibt es ein Problem mit der Eingabe von Umlauten. ?(
      Tippt man z. B ein "ü" und danach z.B. ein "a", dann erscheint nach dem Eintippen von "a" anstatt des vorher angezeigten "ü" die Zeichenfolge "?a?".

      Ich habe es nicht geschafft, das Script so abzuändern, dass diese tolle Script auch mit GM8.1 verwendet werden kann.

      Vielleicht hat jemand eine Idee, wäre schön, wenn dies auch mit GM8.1 einwandfrei funktionieren würde.
      MfG Hubsl

      Etwas abgeändert kann dieses Script auch im GM5 verwendet werden (siehe Wortboxen des Lese-Rechtschreib-Instituts: lrs-legasthenie.at/projekte.html )
      Mit einer Bildschirmtastatur kombiniert ist diese Textbox auch ideal für Android-APKs einsetzbar.

      Nochmals Danke für diesen guten Beitrag!
      Siehe Link: members.aon.at/hubert_burboeck/projekte.html

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „hubsl“ ()