[EasyButton] Buttons zeichnen und abfragen per Script v4

    • Skript

      [EasyButton] Buttons zeichnen und abfragen per Script v4

      EasyButton v4 by derkimba

      Dieses Script richtet sich an GML-Anfänger
      Mit diesem Script könnt ihr ganz einfach einen Button zeichnen (auch mit einem sprite oder purem Text) und auslesen, ob der Button gedrückt worden ist.
      Vorteil: Ihr könnt mit einem Objekt so viele Buttons erstellen, wie ihr wollt und spart euch einige Zeilen Code.

      Erklärung zu draw_button_sprite:
      Spoiler anzeigen

      Das Script muss in einem Draw Event verwendet werden!
      Mit diesem Script könnt ihr ein Sprite zeichnen, das wie ein Button fungiert.
      • Argument0 ist die x-Position, an der euer Button gezeichnet werden soll.
      • Argument1 ist die y-Position eures Buttons.
      • Argument2 ist das Sprite, das den Button darstellen soll.
      • Argument3 ist das SubImage, welches gezeichnet werden soll, wenn die Maus sich nicht über dem Button befindet. Hier kann auch image_index angegeben werden.
      • Argument4 ist das SubImage, welches gezeichnet werden soll, wenn sich die Maus über dem Button befindet. Ebenfalls kann hier image_index geschrieben werden.
      • Argument5 ist der Mausbutton der gedrückt werden soll (mb_left oder mb_right).
      • Argument6 ist die Art der Überprüfung
        (0 = Wenn der Button gedrückt wird ; 1 = Wenn der Button losgelassen wird ; 2 = Während der Button gedrückt wird)

      Das Script liefert "true" zurück, wenn der Button gedrückt wird, ansonsten wird "false" zurückgegeben.

      :event_draw: draw_button_sprite
      Spoiler anzeigen

      GML-Quellcode

      1. // By derkimba
      2. //draw_button_sprite(x1,y1,spr,ii_0,ii_1,mb,typ) liefert true zurück wenn er gedrückt wird, sonst false
      3. var x1,y1,spr,ii_0,ii_1;
      4. x1 = argument0 // x position
      5. y1 = argument1 // y position
      6. spr = argument2 // sprite name
      7. ii_0 = argument3 // normaler image_index
      8. ii_1 = argument4 // image_index wenn maus über dem button ist
      9. mb = argument5 // Linke Maustaste: mb_left oder rechte Maustaste: mb_right
      10. typ = argument6 // 0 = pressed ; 1 = released ; 2 = gedrückt halten
      11. if(mouse_x > x1 && mouse_x < x1+sprite_get_width(spr) && mouse_y > y1 && mouse_y < y1+sprite_get_height(spr))
      12. {
      13. draw_sprite(spr,ii_1,x1,y1)
      14. switch(typ)
      15. {
      16. case 0:
      17. return(mouse_check_button_pressed(mb))
      18. case 1:
      19. return(mouse_check_button_released(mb))
      20. case 2:
      21. return(mouse_check_button(mb))
      22. }
      23. }
      24. else
      25. {
      26. draw_sprite(spr,ii_0,x1,y1)
      27. return false;
      28. }



      Erklärung zu draw_button_button:
      Spoiler anzeigen

      Das Script muss in einem Draw Event verwendet werden!
      Mit diesem Script wird ein rechteckiger Button gezeichnet auf dem ihr einen beliebigen Text zeichnen könnt.
      • Argument0 ist die x1-Position, an der euer Button gezeichnet werden soll.
      • Argument1 ist die y1-Position eures Buttons.
      • Argument2 ist die x2-Position
      • Argument3 ist die y2-Position
      • Argument4 ist der Mausbutton der gedrückt werden soll (mb_left oder mb_right).
      • Argument5 ist die Art der Überprüfung
        (0 = Wenn der Button gedrückt wird ; 1 = Wenn der Button losgelassen wird ; 2 = Während der Button gedrückt wird)
      • Argument6 ist der Text auf dem Button
      • Argument7 ist die Farbe des Buttons
      • Argument8 ist die Farbe des Textes
      • Argument9 ist die Font des Textes (0 für die aktuelle Font)

      Das Script liefert "true" zurück, wenn der Button gedrückt wird, ansonsten wird "false" zurückgegeben.

      :event_draw: draw_button_button
      Spoiler anzeigen

      GML-Quellcode

      1. // By derkimba
      2. //draw_button_button(x1,y1,x2,y2,mb,typ,text,col_b,col_t,font)
      3. var xx1,xx2,yy1,yy2,mb,typ,text,col_b,col_t,font;
      4. xx1 = argument0 // x1 Position
      5. yy1 = argument1 // y1 Position
      6. xx2 = argument2 // x2 Position
      7. yy2 = argument3 // y2 Position
      8. mb = argument4 // Mousebutton (mb_left oder mb_right)
      9. typ = argument5 // Art der Überprüfung(0 = Pressed ; 1 = Released ; 2 = Während)
      10. text = argument6 // Text auf dem Button
      11. col_b = argument7 // Farbe des Buttons
      12. col_t = argument8 // Farbe des Textes
      13. font = argument9 // Font des Textes (0 für das aktuelle Font)
      14. //
      15. if(font != 0) {draw_set_font(font)}
      16. if(mouse_x > xx1 && mouse_x < xx2 && mouse_y > yy1 && mouse_y < yy2)
      17. {
      18. draw_set_color(col_b)
      19. draw_button(xx1,yy1,xx2,yy2,0)
      20. draw_set_color(col_t)
      21. draw_text(xx1+((xx2-xx1-string_width(text))/2),yy1+((yy2-yy1-string_height(text))/2),text)
      22. switch(typ)
      23. {
      24. case 0:
      25. return(mouse_check_button_pressed(mb))
      26. case 1:
      27. return(mouse_check_button_released(mb))
      28. case 2:
      29. return(mouse_check_button(mb))
      30. }
      31. }
      32. else
      33. {
      34. draw_set_color(col_b)
      35. draw_button(xx1,yy1,xx2,yy2,1)
      36. draw_set_color(col_t)
      37. draw_text(xx1+((xx2-xx1-string_width(text))/2),yy1+((yy2-yy1-string_height(text))/2),text)
      38. return false;
      39. }



      Erklärung zu draw_button_text:
      Spoiler anzeigen

      Das Script muss in einem Draw Event verwendet werden!
      Mit diesem Script könnt ihr einen Button erstellen in Form eines Textes.
      • Argument0 ist die x-Position, an der euer Text gezeichnet werden soll.
      • Argument1 ist die y-Position eures Textes.
      • Argument2 ist der Mausbutton der gedrückt werden soll (mb_left oder mb_right)
      • Argument3 ist die Art der Überprüfung
        (0 = Wenn der Button gedrückt wird ; 1 = Wenn der Button losgelassen wird ; 2 = Während der Button gedrückt wird)
      • Argument4 ist der Text der gezeichnet werden soll
      • Argument5 ist die Farbe des Textes, die er hat, wenn sich die Maus nicht darüber befindet
      • Argument6 ist die Farbe des Textes, wenn sich die Maus darüber befindet
      • Argument7 ist der Font der benutzt werden soll (0 für den aktuellen Font)

      Das Script liefert "true" zurück, wenn der Button gedrückt wird, ansonsten wird "false" zurückgegeben.

      :event_draw: draw_button_text
      Spoiler anzeigen

      GML-Quellcode

      1. // By derkimba
      2. //draw_button_text(x,y,mb,typ,text,col_0,col_1,font)
      3. var xx,yy,mb,typ,text,col_0,col_1,font;
      4. xx = argument0 // x-Position des Textes
      5. yy = argument1 // y-Position des Textes
      6. mb = argument2 // Mausbutton der gedrückt werden soll (mb_left oder mb_right)
      7. typ = argument3 // Art der Überprüfung (0 = Pressed ; 1 = Released ; 2 = Während des drückens)
      8. text = argument4 // Der Text der gezeichnet werden soll
      9. col_0 = argument5 // Die Farbe des Textes wenn sich die Maus nicht darüber befindet
      10. col_1 = argument6 // Die Farbe des Textes wenn sich die Maus darüber befindet
      11. font = argument7 // Die Font des Textes (0 für die aktuelle Font)
      12. //
      13. if(font != 0) {draw_set_font(font)}
      14. if(mouse_x > xx && mouse_x < xx+string_width(text) && mouse_y > yy && mouse_y < yy+string_height(text))
      15. {
      16. draw_set_color(col_1)
      17. draw_text(xx,yy,text)
      18. switch(typ)
      19. {
      20. case 0: return(mouse_check_button_pressed(mb))
      21. case 1: return(mouse_check_button_released(mb))
      22. case 2: return(mouse_check_button(mb))
      23. }
      24. }
      25. else
      26. {
      27. draw_set_color(col_0)
      28. draw_text(xx,yy,text)
      29. return false;
      30. }

      Zusätzlich gibt es zu jedem Script noch eine "typ" Variante, die als Argument keinen typ verlangt, sondern diesen zurückliefert:
      Liefert zurück: 0 = Maus nicht über Button ; 1 = Maus über Button ; 2 = Maus drückt den Button ;
      3 = Maus lässt den Button los ; 4 = Während die Maus den Button drückt



      :event_draw: draw_button_sprite_typ
      Spoiler anzeigen

      GML-Quellcode

      1. // http://www.gm-d.de/wbb/index.php/Thread/21176/
      2. // EasyButton by derkimba
      3. //draw_button_sprite_typ(x1,y1,spr,ii_0,ii_1,mb) liefert den typ zurück
      4. var x1,y1,spr,ii_0,ii_1;
      5. x1 = argument0 // x position
      6. y1 = argument1 // y position
      7. spr = argument2 // sprite name
      8. ii_0 = argument3 // normaler image_index
      9. ii_1 = argument4 // image_index wenn maus über dem button ist
      10. mb = argument5 // Linke Maustaste: mb_left oder rechte Maustaste: mb_right
      11. // Liefert zurück: 0 = Maus nicht über Button ; 1 = Maus über Button ; 2 = Maus drückt den Button ;
      12. //3 = Maus lässt den Button los ; 4 = Während die Maus den Button drückt
      13. if(mouse_x > x1 && mouse_x < x1+sprite_get_width(spr) && mouse_y > y1 && mouse_y < y1+sprite_get_height(spr))
      14. {
      15. draw_sprite(spr,ii_1,x1,y1)
      16. if(mouse_check_button_pressed(mb)) {return 2}
      17. if(mouse_check_button(mb)) {return 4}
      18. if(mouse_check_button_released(mb)) {return 3}
      19. return 1;
      20. }
      21. else
      22. {
      23. draw_sprite(spr,ii_0,x1,y1)
      24. return 0;
      25. }


      :event_draw: draw_button_button_typ
      Spoiler anzeigen

      GML-Quellcode

      1. // http://www.gm-d.de/wbb/index.php/Thread/21176/
      2. // EasyButton by derkimba
      3. //draw_button_button_typ(x1,y1,x2,y2,mb,text,col_b,col_t,font) liefert den Typ zurück
      4. var xx1,xx2,yy1,yy2,mb,text,col_b,col_t,font;
      5. xx1 = argument0 // x1 Position
      6. yy1 = argument1 // y1 Position
      7. xx2 = argument2 // x2 Position
      8. yy2 = argument3 // y2 Position
      9. mb = argument4 // Mousebutton (mb_left oder mb_right)
      10. text = argument5 // Text auf dem Button
      11. col_b = argument6 // Farbe des Buttons
      12. col_t = argument7 // Farbe des Textes
      13. font = argument8 // Font des Textes (0 für das aktuelle Font)
      14. // Liefert zurück: 0 = Maus nicht über Button ; 1 = Maus über Button ; 2 = Maus drückt den Button ;
      15. //3 = Maus lässt den Button los ; 4 = Während die Maus den Button drückt
      16. if(font != 0) {draw_set_font(font)}
      17. if(mouse_x > xx1 && mouse_x < xx2 && mouse_y > yy1 && mouse_y < yy2)
      18. {
      19. draw_set_color(col_b)
      20. draw_button(xx1,yy1,xx2,yy2,0)
      21. draw_set_color(col_t)
      22. draw_text(xx1+((xx2-xx1-string_width(text))/2),yy1+((yy2-yy1-string_height(text))/2),text)
      23. if(mouse_check_button_pressed(mb)) {return 2}
      24. if(mouse_check_button(mb)) {return 4}
      25. if(mouse_check_button_released(mb)) {return 3}
      26. return 1;
      27. }
      28. else
      29. {
      30. draw_set_color(col_b)
      31. draw_button(xx1,yy1,xx2,yy2,1)
      32. draw_set_color(col_t)
      33. draw_text(xx1+((xx2-xx1-string_width(text))/2),yy1+((yy2-yy1-string_height(text))/2),text)
      34. return 0;
      35. }


      :event_draw: draw_button_text_typ
      Spoiler anzeigen

      GML-Quellcode

      1. // http://www.gm-d.de/wbb/index.php/Thread/21176/
      2. // EasyButton by derkimba
      3. //draw_button_text_typ(x,y,mb,text,col_0,col_1,font) liefert den typ zurück
      4. var xx,yy,mb,text,col_0,col_1,font;
      5. xx = argument0 // x-Position des Textes
      6. yy = argument1 // y-Position des Textes
      7. mb = argument2 // Mausbutton der gedrückt werden soll (mb_left oder mb_right)
      8. text = argument3 // Der Text der gezeichnet werden soll
      9. col_0 = argument4 // Die Farbe des Textes wenn sich die Maus nicht darüber befindet
      10. col_1 = argument5 // Die Farbe des Textes wenn sich die Maus darüber befindet
      11. font = argument6 // Die Font des Textes (0 für die aktuelle Font)
      12. // Liefert zurück: 0 = Maus nicht über Button ; 1 = Maus über Button ; 2 = Maus drückt den Button ;
      13. // 3 = Maus lässt den Button los ; 4 = Während die Maus den Button drückt
      14. if(font != 0) {draw_set_font(font)}
      15. if(mouse_x > xx && mouse_x < xx+string_width(text) && mouse_y > yy && mouse_y < yy+string_height(text))
      16. {
      17. draw_set_color(col_1)
      18. draw_text(xx,yy,text)
      19. if(mouse_check_button_pressed(mb)) {return 2}
      20. if(mouse_check_button(mb)) {return 4}
      21. if(mouse_check_button_released(mb)) {return 3}
      22. return 1;
      23. }
      24. else
      25. {
      26. draw_set_color(col_0)
      27. draw_text(xx,yy,text)
      28. return 0;
      29. }


      Im Anhang befindet sich noch ein kleines Beispiel und die Scriptdatei ;)
      Ich hoffe, dass dieses Script besonders den Anfängern in GML etwas hilft. Falls noch Fragen oder Wünsche bestehen einfach posten.

      Gruß, derkimba
      Dateien
      • EasyButton v4.zip

        (14,94 kB, 104 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 38 mal editiert, zuletzt von „derkimba“ () aus folgendem Grund: Rechtschreibfehler und optische Anpassungen sowie neue Scripts

      Danke :thumbsup:
      damit erspartst du mir viel Arbeit, ich hab das früher immer mit draw_button() gemacht und dann per Koordinaten überprüft ob die Maus sich auf dem Button befindet.
      Und hier gibt es ja noch extra funktionen wie Button pressed, Button released :event_mouse: mouse enter, :event_mouse: mouse leave und ob es die Linke- oder Rechte Maustaste ist.
      Echt super :thumbup:

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

      Schönes skript! :)
      Aber eine Frage: Hast du den Mittelteil absichtlich so aufwendig geschrieben?

      GML-Quellcode

      1. if(mouse_check_button_released(mb))
      2. {
      3. return true;
      4. }
      5. else
      6. {
      7. return false;
      8. }
      ist in diesem fall nämlich genau equivalent zu:

      GML-Quellcode

      1. return(mouse_check_button_released(mb));

      Macht im Endefekt natürlich keinen wirklichen Unetrschied..

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
      Habs versucht für die GML-Anfänger übersichtlich darzustellen, damit diese den Code einfacher lesen können, aber da es ja eh jeder nur kopiert und bei sich einfügt, kommt es ja eh auf das gleiche raus :D

      derkimba schrieb:

      Habs versucht für die GML-Anfänger übersichtlich darzustellen, damit diese den Code einfacher lesen können, aber da es ja eh jeder nur kopiert und bei sich einfügt, kommt es ja eh auf das gleiche raus :D
      Ok xP
      Weiter so mit den netten Skripten!

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
      Wenn du jetzt noch machst, das die Font nach dem drawen wieder zurückgesetzt wird, währe das echt perfekt.
      Aber mein Danke kriegst du auch so. :D
      Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
      Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
      Nach langer zeit wieder im Forum aktiv :D
      @Larsi: Leider ist dies nicht möglich, da es keinen Befehl gibt, mit dem man den aktuellen Font auslesen kann :|

      UPDATE: Es wurde ein neues Script hinzugefügt, mit dem ihr jetzt auch aus einfachen Texten Buttons erstellen könnt (Beispieldatei wurde aktualisiert)

      Gruß, derkimba
      Hmmm wenn das nun auch noch tatsache mit DRAW_GUI in Studio funktionieren sollte und sich das abtasten unabhängig der View klappt wäre dies eine sehr gute Erweiterung ich werde dies mal ausprobieren ;).
      (Du scheinst ja kein Studio zu benutzen ;) )
      @Sasula: Doch ich verwende auch Gamemaker Studio ;)
      Die Scripts funktionieren in allen GameMaker Versionen, auch in GameMaker Studio's DrawGUI Event.
      Falls nicht bitte bescheid sagen, dann ändere ich den Code.

      Gruß, derkimba
      Ich werde es wohl im Laufe des Abends testen.

      Ich arbeite Derzeit an einem Level Editor und da man zoomen kann sollten sich die Auswählbaren Elemente natürlich nicht mit bewegen...
      Wollte heute damit anfangen das ganze aufs GUI Event um zu bauen (was wie jeder weiß nervt wegen den Virtual Keys oder wie man es machen will)...

      Dann wäre dieses Script Tatsache im Perfekten Zeitpunkt erschienen ^_^.
      Ja das klappt Wunderbar.

      Ich muss mal schauen ob ich da noch eine Möglichkeit für Mouse Enter/Leave hin bekomme denn bei meinen Editor kommt sobald man mit der Maus drüber ist ein kleiner Bubbletip.
      UPDATE: Zu jedem der 3 vorhandenen Scripts wurde eine "typ" Variante hinzugefügt. Diese ermöglicht euch live zu überprüfen, wie der Spieler gerde mit dem Button interagiert. Ihr müsst dabei als Argument keinen Typ mit angeben, denn dieser wird ja zurückgeliefert.
      Liefert zurück: 0 = Maus nicht über Button ; 1 = Maus über Button ; 2 = Maus drückt den Button ; 3 = Maus lässt den Button los ; 4 = Während die Maus den Button drückt

      Das Example wurde aktualisiert und die Scriptdatei erneuert. Download im ersten Post ;)

      Würde mich freuen wenn ihr mich in den Credits erwähnt, ihr müsst aber natürlich nicht :thumbsup:

      Gruß, derkimba
      Perfekt mein Freund hast dir echt was verdient ^^.

      Funktioniert Perfekt nun kann man Variablen bzw. ALLES nur alleine schon über Berührungen Steuern.
      (Solltest das ins Example einbauen da ich bezweifele das dies auch jeder Erkennt.)

      (Solltest dieses Example letztlich auch mit der Englischen Community teilen denke das dies einfach das GUI Event sinnvoll erweitert ;) )

      Vielen dank für deine Mühe

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