[EasyBox] Checkboxen zeichnen und abfragen per Script v2

    • Skript
    • [EasyBox] Checkboxen zeichnen und abfragen per Script v2

      EasyBox v2 by derkimba


      Dieses Script richtet sich an GML-Anfänger
      Mit diesem Script könnt ihr ganz einfach Checkboxen erstellen und diese Abfragen.
      Vorteil: Ihr könnt mit einem einzigen Objekt so viele Checkboxen erstellen wie ihr wollt und ihr könnt von anderen Objekten aus trotzdem auf die Checkbox zugreifen und sie von überall aus abfragen oder ändern.

      Erklärung zu draw_checkbox_sprite:
      Spoiler anzeigen

      Mit diesem Script könnt ihr mit euren eigenen Sprites Checkboxen machen.
      Wichtig hierbei ist, dass euer Checkbox Sprite 4 SubImages hat:
      • Das erste ist die Checkbox wenn sie deaktiviert ist und sich die Maus nicht darüber befindet
      • Das zweite ist die Checkbox, wenn sie aktiviert ist und die Maus nicht darüber ist.
      • Das dritte ist die Checkbox, wenn sie nicht aktiviert ist, aber die Maus darüber ist.
      • Das vierte ist die Checkbox, wenn sie aktiviert ist und die Maus darüber ist.

      Folgende Argumente müssen mit übergeben werden:
      • Argument0 ist die x-Position eurer Checkbox
      • Argument1 ist die y-Position eurer Checkbox
      • Argument2 ist das Sprite eurer Checkbox (dieses muss wie oben geschrieben aufgebaut sein)
      • Argument3 ist der Mausbutton der überprüft werden soll (mb_left oder mb_right)
      • Argument4 ist der Index eurer Checkbox. Dies muss als String angegeben werden. Mithilfe dieses Indexes könnt ihr auf die Checkbox zugreifen, er funktioniert wie eine lokale Variable und enthält den Wert 0 = Checkbox deaktiviert oder 1 = Checkbox ist aktiviert. Jede Checkbox braucht einen anderen Index, haben sie den selben, ahmen sie sich gegenseitig nach.

      Die Funktion liefert den image_index zurück, also 0 bei deaktiviert und Maus nicht darüber, 1 bei aktiviert und Maus nicht darüber, 2 bei deaktiviert und Maus darüber, 3 bei aktiviert und Maus darüber. Wenn du nur überprüfen willst ob die Checkbox aktiviert ist oder nicht, kannst du den Index abfragen (siehe Example)

      :event_draw: draw_checkbox_sprite
      Spoiler anzeigen

      GML-Quellcode

      1. // http://www.gm-d.de/wbb/index.php/Thread/21187/
      2. // By derkimba
      3. //draw_checkbox_sprite(x,y,spr,mb,index)
      4. var xx,yy,spr,status,index;
      5. xx = argument0 // x-Position der Checkbox
      6. yy = argument1 // y-Position der Checkbox
      7. spr = argument2 // Sprite der Checkbox
      8. mb = argument3 // Mausbutton der abgefragt werden soll (mb_left oder mb_right)
      9. index = argument4 // Der Index der Checkbox (muss ein String sein)
      10. // Mit dem Index kannst du jederzeit auf den Wert der Checkbox zugreifen (0 = deaktiviert , 1 = aktiviert)
      11. // Jede Checkbox braucht einen anderen Index, wenn 2 Checkboxen den selben Index haben,
      12. // ahmen sie sich gegenseitig nach, dies kann natürlich auch von Vorteil sein.
      13. if(!variable_local_exists(index)) {variable_local_set(index,0)}
      14. //
      15. if(mouse_x > xx && mouse_x < xx+sprite_get_width(spr) && mouse_y > yy && mouse_y < yy+sprite_get_height(spr))
      16. {
      17. if(variable_local_get(index) == 0)
      18. {
      19. status = 2
      20. draw_sprite(spr,status,xx,yy)
      21. }
      22. if(variable_local_get(index) == 1)
      23. {
      24. status = 3
      25. draw_sprite(spr,status,xx,yy)
      26. }
      27. if(mouse_check_button_pressed(mb))
      28. {
      29. if(variable_local_get(index) == 1) {variable_local_set(index,0)}
      30. else if(variable_local_get(index) == 0) {variable_local_set(index,1)}
      31. }
      32. }
      33. else
      34. {
      35. draw_sprite(spr,variable_local_get(index),xx,yy)
      36. status = variable_local_get(index)
      37. }
      38. return status;
      Alles anzeigen


      Erklärung zu draw_checkbox_checkbox
      Spoiler anzeigen

      Mit diesem Script könnt ihr ohne ein Sprite zu erstellen eine simple Checkbox zeichnen und ihren Status abfragen
      Folgende Argumente müssen dabei angegeben werden:
      • Argument0 ist der x1-Wert
      • Argument1 ist der y1-Wert
      • Argument2 ist der x2-Wert
      • Argument3 ist der y2-Wert
      • Argument4 ist der Mousebutton der überprüft werden soll (mb_left oder mb_right)
      • Argument5 ist die Breite des Kreuzes
      • Argument6 ist die Farbe des Rahmens der Box wenn Maus nicht darüber ist
      • Argument7 ist die Farbe des Rahmens der Box wenn die Maus darüber ist
      • Argument8 ist die Farbe des Kreuzes wenn die Checkbox aktiviert ist und die Maus nicht über der Box ist
      • Argument9 ist die Farbe des Kreuzes bei aktivierter Box und wenn die Maus über der Box ist
      • Argument10 ist die Hintergrundfarbe der Checkbox
      • Argument11 ist der Index eurer Checkbox. Dies muss als String angegeben werden. Mithilfe dieses Indexes könnt ihr auf die Checkbox zugreifen, er funktioniert wie eine lokale Variable und enthält den Wert 0 = Checkbox deaktiviert oder 1 = Checkbox ist aktiviert. Jede Checkbox braucht einen anderen Index, haben sie den selben, ahmen sie sich gegenseitig nach.

      Die Funktion liefert den image_index zurück, also 0 bei deaktiviert und Maus nicht darüber, 1 bei aktiviert und Maus nicht darüber, 2 bei deaktiviert und Maus darüber, 3 bei aktiviert und Maus darüber. Wenn du nur überprüfen willst ob die Checkbox aktiviert ist oder nicht, kannst du den Index abfragen (siehe Example)

      :event_draw: draw_checkbox_checkbox
      Spoiler anzeigen

      GML-Quellcode

      1. // http://www.gm-d.de/wbb/index.php/Thread/21187/
      2. // By derkimba
      3. //draw_checkbox_checkbox(x1,y1,x2,y2,mb,width,col_0,col_1,col_x_0,col_x_1,col_b,index)
      4. var xx1,xx2,yy1,yy2,mb,width,col_0,col_1,col_x_0,col_x_1,status,index;
      5. xx1 = argument0 // x1-Position der Checkbox
      6. yy1 = argument1 // y1-Position der Checkbox
      7. xx2 = argument2 // x2-Position der Checkbox
      8. yy2 = argument3 // y2-Position der Checkbox
      9. mb = argument4 // Mausbutton der abgefragt werden soll (mb_left oder mb_right)
      10. width = argument5
      11. col_0 = argument6 // Farbe des Rahmens der Box wenn Maus nicht darüber ist
      12. col_1 = argument7 // Farbe des Rahmens der Box wenn die Maus darüber ist
      13. col_x_0 = argument8 // Farbe des Kreuzes wenn die Checkbox aktiviert ist und die Maus nicht über der Box ist
      14. col_x_1 = argument9 // Farbe des Kreuzes bei aktivierter Box und wenn die Maus über der Box ist
      15. col_b = argument10 // Hintergrundfarbe der Checkbox
      16. index = argument11 // Der Index der Checkbox (muss ein String sein)
      17. // Mit dem Index kannst du jederzeit auf den Wert der Checkbox zugreifen (0 = deaktiviert , 1 = aktiviert)
      18. // Jede Checkbox braucht einen anderen Index, wenn 2 Checkboxen den selben Index haben,
      19. // ahmen sie sich gegenseitig nach, dies kann natürlich auch von Vorteil sein.
      20. if(!variable_local_exists(index)) {variable_local_set(index,0)}
      21. //
      22. draw_rectangle_color(xx1,yy1,xx2,yy2,col_b,col_b,col_b,col_b,0)
      23. if(mouse_x > xx1 && mouse_x < xx2 && mouse_y > yy1 && mouse_y < yy2)
      24. {
      25. if(variable_local_get(index) == 0)
      26. {
      27. status = 2
      28. draw_rectangle_color(xx1,yy1,xx2,yy2,col_1,col_1,col_1,col_1,1)
      29. }
      30. if(variable_local_get(index) == 1)
      31. {
      32. status = 3
      33. draw_rectangle_color(xx1,yy1,xx2,yy2,col_1,col_1,col_1,col_1,1)
      34. draw_line_width_color(xx1,yy1,xx2,yy2,width,col_x_1,col_x_1)
      35. draw_line_width_color(xx1,yy2,xx2,yy1,width,col_x_1,col_x_1)
      36. }
      37. if(mouse_check_button_pressed(mb))
      38. {
      39. if(variable_local_get(index) == 1) {variable_local_set(index,0)}
      40. else if(variable_local_get(index) == 0) {variable_local_set(index,1)}
      41. }
      42. }
      43. else
      44. {
      45. draw_rectangle_color(xx1,yy1,xx2,yy2,col_0,col_0,col_0,col_0,1)
      46. if(variable_local_get(index) == 1)
      47. {
      48. draw_line_width_color(xx1,yy1,xx2,yy2,width,col_x_0,col_x_0)
      49. draw_line_width_color(xx1,yy2,xx2,yy1,width,col_x_0,col_x_0)
      50. }
      51. status = variable_local_get(index)
      52. }
      53. return status;
      Alles anzeigen

      Ich hoffe, dass dieses Script einigen von euch helfen wird :)
      Würde mich freuen, wenn ihr mich in den Credits erwähnt, wenn ihr das Script benutzt.
      Hier noch ein kleines Beispiel um den Index zu erklären:

      GML-Quellcode

      1. status = draw_checkbox_checkbox(100,390,130,420,mb_left,3,c_black,c_gray,c_green,c_gray,"superbox"))
      2. // Die Variable status enthält nun den Wert 0,1,2 oder 3 (siehe Erklärung)
      3. draw_text(200,390,string(superbox))
      4. // Wir können hier den Index (der wie eine Variable existiert) ebenfalls abfragen und anzeigen. Er enthält den Wert 0 oder 1 (siehe Erklärung)
      5. // Dadurch können wir auch aus anderen Objekten auf unsere Checkbox zugreifen:
      6. // obj_checkbox.superbox = 1 kann beispielsweise unsere Checkbox aktivieren, ohne das wir mit der Maus auf die Checkbox klicken ;)

      Im Anhang befindet sich ein kleines Beispiel, sowie die Scriptdatei

      Gruß, derkimba
      Dateien
      • EasyBox v2.zip

        (12,5 kB, 129 mal heruntergeladen, zuletzt: )
      • EasyBox v1.zip

        (12,18 kB, 127 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von derkimba ()

    • Hi,

      ich suche derzeit verzeifeld eine Möglichkeit checkboxen in meine GUI einzufügen. Dein Script kam mir da gerade recht, muss jetzt jedoch feststellen, dass fast alle Funktionen inzwischen in GM:S Obsolete sind :(

      Einige Funktionen kann ich noch mit einem Workaround nutzen... aber leider nicht alle. Hat jemand ein aktuelles GM:S checkboxen "system" im Einsatz oder kann dies hier anpassen? Meine Kentniss reichen dafür leider nicht aus :(

      Liebe Grüsse
      Mirko

      Edit: Hat sich inzwischen erledigt... im offiziellen YoYo-Forum bin ich nach längerer Suche doch noch fündig geworden :)

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