Also ich bin mal auf die Idee gekommen, zu probieren Radiobuttons (eigendlich auch Checkboxen, aber nicht jetzt. in nem anderen Tutorial vielleicht) zuerstellen.
Dies habe ich nun auch geschafft (nach ner halben Stunde^^) und möchte euch nun zeigen wie das geht.
Wichtig: Dieses Tutorial erfordert gml Kenntnisse.
Erstmal vorab:
Spoiler anzeigen
Also... Dann legen wir mal los:
Wir wollen einen Radio-Button:
Dazu tun wir folgendes:
Wir erstellen ein neues Object, benennen dieses nach unserem Wunsch (ich nenne es "ObjRadio")
und schreiben jetzt folgendes hinein:
Create Event
:
So nun müssen wir erstmal die Grundlagen festlegen, die ein Radio-Button braucht:
Spoiler anzeigen
So...
Damit unser GameMaker Projekt nicht unüberschtlich wird, überlassen wir einem Script das Erstellen dieses Buttons, damit wir jederzeit nur mit einer Zeile einen neuen Radio-Button erstellen können.
Also wir klicken oben auf "Resources" --> "Create Script".
Nun öffnet das Scriptfenster.
Bei "Name" geben wir den Name des Scriptes ein (beliebiger Name).
Ich nenne dieses "CreateRadio".
Hierein schreiben wir jetzt folgendes:
Spoiler anzeigen
Alles anzeigen
So das fügen wir jetzt im Create Event hinzu.
Sooft, wie viele Radio-Buttons ihr haben wollt:
Spoiler anzeigen
So das Problem ist, dass der Radio-Button noch nicht angezeigt wird...
Das kommt jetzt:
Damit das Draw-Event nicht zu unübersichtlich wird, erstellen wir auch hierfür ein neues Script (ich nenne es "DrawRadio"):
Spoiler anzeigen
Alles anzeigen
So dieses Script wird nun im Draw-Event so aufgerufen:
So jetzt haben wir 4 Radio-Buttons, die aber noch nichts können.
Jetzt kommt das wichtigste:
Das Überprüfen, ob auf einen Button angeklickt wurde.
Wie machen wir das?
So:
Hachja... Immer diese Übersicht...
Wir erstellen wieder ein neues Script.
Ich nenne dieses jetzt mal "CheckRadio".
Dieses Sript hat die Aufgabe alle Radio-Buttons zu überprüfen:
Spoiler anzeigen
Alles anzeigen
So... jetzt haben wir die Kontrolle fertig.
Diese muss vor jeder anderen Radio-Button "Funktion" stehen (außer dem CreateRadio; am besten im begin step
ganz oben)
und wird mit
aufgerufen.
Jetzt haben wir schonmal die Radio-Buttons größten Teils fertig.
Jetzt will aber niemand Radio-Buttons, die nichts bringen, sondern es soll was passieren.
Dazu kommt folgendes (ganz einfach):
In dem Event, wo was passieren soll, könnte man das machen:
das wäre jetzt aber unpraktisch, weil man ja mehrere Buttons in einer Klasse hat und es ja interessanter ist, welcher innerhalb der Klasse angeklickt wurde.
Also erstellen wir wieder ein Script (ich nenne es "CheckRadioClass"):
Spoiler anzeigen
Alles anzeigen
Nun können wir ganz einfach überprüfen, welcher angeklickt ist:
(Das entsprechende Event)... Beispiel:
Spoiler anzeigen
Alles anzeigen
So... jetzt kann man Radio-Buttons erstellen, zeichnen, anklicken, überprüfen... öhm war da noch was? Ich glaube nicht.
Achja: nicht vergessen das Object in den Room zu setzten
-Tobi
PS: Warum muss das denn so lang sein
Dies habe ich nun auch geschafft (nach ner halben Stunde^^) und möchte euch nun zeigen wie das geht.
Wichtig: Dieses Tutorial erfordert gml Kenntnisse.
Erstmal vorab:
Was ist ein Radio-Button?
Was ist eine Checkbox?
Das wichtige dabei, Radio-Buttons kann man in eine Klasse zusammenfügen und pro Klasse kann nur einer angeklickt werden.
Was ist eine Checkbox?
Das wichtige dabei, Radio-Buttons kann man in eine Klasse zusammenfügen und pro Klasse kann nur einer angeklickt werden.
Also... Dann legen wir mal los:
Wir wollen einen Radio-Button:
Dazu tun wir folgendes:
Wir erstellen ein neues Object, benennen dieses nach unserem Wunsch (ich nenne es "ObjRadio")
und schreiben jetzt folgendes hinein:
Create Event

So nun müssen wir erstmal die Grundlagen festlegen, die ein Radio-Button braucht:
- er braucht x/y-Koordinaten, um ihn genau zu platzieren
- er braucht eine Klasse, der er angehört
- er braucht einen Text
- er muss entweder angeklickt oder nicht sein
- und zu guter letzt müssen wir noch wissen, ob er angezeigt wird (sonst gibt es nachher ein paar Fehler)
So...
Damit unser GameMaker Projekt nicht unüberschtlich wird, überlassen wir einem Script das Erstellen dieses Buttons, damit wir jederzeit nur mit einer Zeile einen neuen Radio-Button erstellen können.
Also wir klicken oben auf "Resources" --> "Create Script".
Nun öffnet das Scriptfenster.
Bei "Name" geben wir den Name des Scriptes ein (beliebiger Name).
Ich nenne dieses "CreateRadio".
Hierein schreiben wir jetzt folgendes:
GML-Quellcode
- /*
- Erklärung:
- CreateRadio(text,clicked,class);
- 1.Argument: der Text der zum Radio-Button gehört (string/text)
- 2.Argument: ob der Button von Anfang an angeklickt sein soll (boolean: true/false)
- 3.Argument: die Klasse, der er angehört (integer/Zahl)
- */
- RadioDrawed[RadioCounter]=false;
- //deklariert einen Array mit dem Index der Variable RadioCounter, wodurch der Index nie gleich ist --> das ist die ID
- //noch ist der Button nicht gedrawt
- RadioText[RadioCounter]=string(argument0);
- //deklariert einen Array mit dem Index der Variable RadioCounter; setzt diese auf den Text, der in argument0 (das erste) übergeben wurde
- RadioClicked[RadioCounter]=argument1;
- //deklariert einen Array mit dem Index der Variable RadioCounter; setzt diese auf true (wenn angeklickt sein soll)/false (wenn nicht angklickt sein soll)
- RadioClass[RadioCounter]=argument2;
- //deklariert einen Array mit dem Index der Variable RadioCounter; setzt diese auf die Klasse, die in argument2 (das dritte) übergeben wurde
- RadioCounter+=1;
- //erhöht den RadioCounter um 1, damit ist jede ID anders
- return RadioCounter-1;
- //gibt die ID des soeben erstellten Buttons ein
So das fügen wir jetzt im Create Event hinzu.
Sooft, wie viele Radio-Buttons ihr haben wollt:
Create Event wysiwyg image:
Alles anzeigen
GML-Quellcode
- RadioCounter=0;
- /*
- Wir erstellen zunächst eine Variable,
- die wir später brauchen, um jedem
- Radio-Button eine eigene Identifikationsnummer zuzuweisen.
- */
- Radio1=CreateRadio("Radio-Button:1 - Klasse: 0",true,0); //Dieser Radio-Button gehört zur Klasse "0" -- angeklickt
- Radio2=CreateRadio("Radio-Button:2 - Klasse: 0",false,0); //Dieser gehört ebenfalls zu Klasse "0" -- nicht angeklickt
- Radio3=CreateRadio("Radio-Button:1 - Klasse: 1",false,1); //Dieser Radio-Button gehört jedoch zur Klasse "1"-- nicht angeklickt
- Radio4=CreateRadio("Radio-Button:2 - Klasse: 1",true,1); //Dieser gehört auch zu Klasse "1" -- angeklickt
- Radio5=CreateRadio("Radio-Button:3 - Klasse: 1",false,1); //Dieser gehört auch zu Klasse "1" -- nicht angeklickt
- //das erstellt 5 Radio Buttons
- //WICHTIG: die id muss in eine variable aufgenommen werden: Radio2=CreateRadio(...);
- //Dies wird für spätere Scripte benötigt
So das Problem ist, dass der Radio-Button noch nicht angezeigt wird...
Das kommt jetzt:
Damit das Draw-Event nicht zu unübersichtlich wird, erstellen wir auch hierfür ein neues Script (ich nenne es "DrawRadio"):
GML-Quellcode
- /*
- Erklärung:
- DrawRadio(ID,x,y);
- 1.Argument: Die id des Radio-Buttons (oben habe ich z.B. Radio1 genommen... diese muss hier beim aufrufen des Scriptes eingesetzt werden)
- 2./3. Argument: Die Position des Radio-Buttons
- */
- var __col;
- __col=draw_get_color();
- //erstellt kurzfristig eine variable, die die aktuell gesetzte Farbe speichert, damit am restlichen "Spiel" nichts geändert wird
- RadioDrawed[argument0]=true;
- //da der entsprechende Button jetzt gedrawt wird, wird der array auf true gesetzt
- draw_set_color(c_white);
- draw_circle(argument1,argument2,4,false);
- //zeichnet einen ausgefüllten Kreis mit dem Radius 4 an der Stelle, wo der Radio-Button sein soll (das ist der Hintergrund des Radio-Buttons)
- draw_set_color(c_black);
- draw_circle(argument1,argument2,4,true);
- //zeichnet einen schwarzen nicht ausgefüllten Kreis auf den weißen (der Rand)
- //so nun müssen wir überprüfen, ob der Button angeklickt ist:
- if (RadioClicked[argument0]=true)
- {
- draw_set_color(c_green);
- draw_circle(argument1,argument2,2,false);
- //falls das der Fall ist, wird ein grüner Punkt in die Mitte gezeichnet
- }
- draw_set_color(c_black);
- draw_text(argument1+8,argument2-6,RadioText[argument0]);
- //so nur noch der Text des Buttons an der richtigen Stelle
- RadioXpos[argument0]=argument1;
- RadioYpos[argument0]=argument2;
- //damit wird die Position des Buttons gespeichert
- draw_set_color(__col);
- //setzt die Farbe wieder auf die Standartfarbe
So dieses Script wird nun im Draw-Event so aufgerufen:
So jetzt haben wir 4 Radio-Buttons, die aber noch nichts können.
Jetzt kommt das wichtigste:
Das Überprüfen, ob auf einen Button angeklickt wurde.
Wie machen wir das?
So:
Hachja... Immer diese Übersicht...
Wir erstellen wieder ein neues Script.
Ich nenne dieses jetzt mal "CheckRadio".
Dieses Sript hat die Aufgabe alle Radio-Buttons zu überprüfen:
GML-Quellcode
- /*
- Erklärung:
- Hier brauchen wir nicht viel:
- CheckRadio();
- Da es alles kontrolliert braucht es auch keine argumente.
- */
- for(i=0; i<RadioCounter; i+=1)
- {
- //damit jeder Button überprüft wird, gehen wir auch jeden durch.
- if (RadioDrawed[i]=true)
- {
- //das hier macht nur Sinn, wenn der entsprechende Button überhaupt da ist.
- if (mouse_check_button_pressed(mb_left))
- {
- //da ja nichts passiert, wenn die Maus auch nicht gedückt wird, überprüfen wir das hier auch nochmal
- if (mouse_x>RadioXpos[i]-4) and (mouse_y>RadioYpos[i]-4) and (mouse_x<RadioXpos[i]+4+string_width(RadioText[i])) and (mouse_y<RadioYpos[i]-6+string_height(RadioText[i]))
- {
- //wenn die Maus über Button und dem dazugehörigem Text ist
- //dann...
- for(d=0;d<RadioCounter;d+=1)
- {
- //... durchsuchen wir die Buttons nach Klassen und...
- if (RadioClass[i]=RadioClass[d])
- {
- //... wenn einer aus der Klasse gefunden wurde...
- RadioClicked[d]=false;
- //... darf dieser ja nicht mehr angeklickt sein
- }
- }
- RadioClicked[i]=true;
- //da dabei der eigendlich angeklickte Button auch ausgeschaltet würde, stellen wir diesen nachher auf true
- }
- }
- }
- }
So... jetzt haben wir die Kontrolle fertig.
Diese muss vor jeder anderen Radio-Button "Funktion" stehen (außer dem CreateRadio; am besten im begin step

und wird mit
aufgerufen.
Jetzt haben wir schonmal die Radio-Buttons größten Teils fertig.
Jetzt will aber niemand Radio-Buttons, die nichts bringen, sondern es soll was passieren.
Dazu kommt folgendes (ganz einfach):
In dem Event, wo was passieren soll, könnte man das machen:
das wäre jetzt aber unpraktisch, weil man ja mehrere Buttons in einer Klasse hat und es ja interessanter ist, welcher innerhalb der Klasse angeklickt wurde.
Also erstellen wir wieder ein Script (ich nenne es "CheckRadioClass"):
GML-Quellcode
- /*
- Erklärung:
- CheckRadioClass(class);
- 1.Argument: die Klasse, die untersucht werden soll
- */
- for (i=0; i<RadioCounter; i+=1)
- {
- //geht alle RadioButtons durch...
- if (RadioClass[i]=argument0)
- {
- //--- wenn einer aus der Klasse gefunden wird...
- if (RadioClicked[i]=true)
- {
- //wird überprüft, ob dieser angeklickt ist...
- return i;
- exit;
- //und dann wird seine id ausgegeben und die schleife beendet
- }
- }
- }
Nun können wir ganz einfach überprüfen, welcher angeklickt ist:
(Das entsprechende Event)... Beispiel:
GML-Quellcode
- switch(CheckRadioClass(1))
- {
- case Radio3:
- //mach das und das
- break;
- case Radio4:
- //mach so und so
- break;
- case Radio5:
- //mach das so
- break;
- default:
- //das kann eigendlich nicht passieren, da einer angeklickt ist und immer nur einer angeklickt ist
- //aber sicher ist sicher
- break;
- }
- /*
- Es ginge auch:
- if (CheckRadioClass(1)=Radio2) //oder jeder andere Radio-Button
- {
- //mach dies und das
- }
- Das ist aber umständlicher
- */
So... jetzt kann man Radio-Buttons erstellen, zeichnen, anklicken, überprüfen... öhm war da noch was? Ich glaube nicht.
Achja: nicht vergessen das Object in den Room zu setzten

-Tobi
PS: Warum muss das denn so lang sein

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