Mehrere Healthbars

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Mehrere Healthbars

      Was die Healthbar kann:
      Sie färbt sich zwischen grün, gelb und rot.
      Ist individuell in der Breite, und passt sich der des Sprites an, wenn das nicht gefällt, der kann aber auch mit der änderung einer Variable sie verlänger / verkürzen.
      Auch für Lite User.
      Und selbst GML Anfänger sollten sie einbauen können.

      Zu D&D:
      Ich hatte auch eine D&D Variante, jedoch hat diese einen Fehler den ich mit D&D nicht lösen kann. Deswegen lasse ich diese Variante weg.

      Achja: Dies wurde extra so ausführlich beschrieben, damit es auch leute verstehen die vielleicht grade erst mit GML angefangen haben!

      Der Anfang
      Erstellt ein neues Objekt und gibt diesen Objekt ein Sprite.

      Initialisieren der Variablen
      Im Create Event () Initialisieren wir die 3 Variablen die wir benötigen. Wir nennen diese Variablen einfach mal "hp", "hp_max" und "size".

      • hp = HP steht für "Health Points", und soll die momentane HP des Objektes anzeigen.
      • hp_max = Dieser Wert ist die maximale HP, die das Objekt bekommen kann.
      • size = Die Breite des Balken.
      Mittels der Action Execute Code () schreiben wir nun folgenden Code:

      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. hp = 150;
      3. hp_max = 150;
      4. size = sprite_get_width(sprite_index);
      5. }


      Nun haben wir die HP auf 150 gesetzt, genau so wie die hp_max, also hat das Objekt grade volle HP.

      size haben wir auf "sprite_get_width(sprite_index);" gestellt.
      Die Funktion sprite_get_width() gibt die Breite eines Sprites wieder. "sprite_index" gibt das momentan verwendete Sprite wieder. Somit erhalten wir die Breite des momentanen Sprites.
      Du könntest hier auch ein wert wie zum Beispiel 30 eingeben, wenn du nicht willst, das die Healthbar so lang ist wie da Objekt.

      Die Healthbar zeichen
      Nun kommen wir zum spannenden Teil, wir wollen die Healthbar zeichnen.
      Dafür erstellen wir in unserem Objekt das Draw Event (). Wieder einmal erstellen wir die Aktion Execute Code () hier.

      Zu aller erst wollen wir unser Sprite wieder zeichnen, denn wenn wir etwas zeichnen geht das Sprite weg, warum auch immer. Dies können wir aber schnell wieder beheben in dem wir diese Funktion "draw_sprite();" verwenden.
      Sie zeichnet ein Sprite an den Koordinaten x,y, mit einen subimage das wir einstellen könenn.

      Wir schreiben also:

      GML-Quellcode

      1. {
      2. draw_sprite(sprite_index,-1,x,y);
      3. }


      Wieder wird mit "sprite_index" das Sprite des Objektes bestimmt. Durch -1 bei den Subimage wird das aktuelle Subimage genommen. Die beiden variablen x,y bringen das Sprite an die Position x, y, des Objektes.

      Da wir wollen das der Rand der Healthbar über der Anzeige ist, zeichnen wir den Rand zum Schluss.

      Als erstes bestimmen wir die Farbe die wir im moment brauchen. Ob grün, gelb oder rot. Dafür rechnen wir als erstes die aktuelle HP in Prozente um, und überprüfen dann, ob die HP über 50% ist, dann nehmen wir grün, oder unter 50%, aber über 20%, dann nehmen wir gelb, oder unter 20%, dann nehmen wir die rot.

      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. draw_sprite(sprite_index,-1,x,y);
      3. if (round(hp/hp_max*100) >= 50)
      4. draw_set_color(c_green);
      5. else if (round(hp/hp_max*100) <= 50 && round(hp/hp_max*100) >= 20)
      6. draw_set_color(c_yellow);
      7. else
      8. draw_set_color(c_red);
      9. }


      Spoiler anzeigen
      Zur Rechnung:
      Mit der Funktion round() wird gerundet. 1,2,3,4 -> abgerundet und bei 5,6,7,8,9 -> aufgerundet.
      Um die Prozentzahl der aktuellen HP zu griegen, nehmen wir die HP geteilt durch die Maximale HP. Daraus ergibt sich eine Zahl zwischen 1 und 0. Hierbei steht 1 für 100%, und 0 für 0% (0,56 = 56% etc.).
      Würden wir jetzt runden, würde immer 1, oder 0 rauskommen. Deswegen nehmen wir mal 100, somit griegen wir die "echten" Prozente, runden dann auf (falls komma stellen kommen), und überprüfen dann mit der If-Schleife in welchen Bereich die aktuelle HP grade liegt.


      Nachdem wir die Farbe bestimmt haben, müssen wir nun das Rechteck zeichnen.
      Hierfür benutzten wir "draw_rectangle(x1,y1,x2,y2,outline);". Mit den Werten x1, y1 bestimmen wir wie in einem Koordinaten Kreut wo der erste Punkt sein soll, und mit x2, y2, wo der zweite Punkt sein soll. Diese werden dann miteinder Verbunden und ergeben ein Viereck. Outlien sagt uns, ob wir nur die aussenlinien, oder ein gefülltes Rechteck zeichnen wollen.

      Wir wollen 10 pixel über dem Objekt den ersten Punkt setzten, und als x Koordinate die x Koordinate des Objektes benutzten. Den zweiten Punkt wollen wir 5 Pixeln über dem Objekt setzten. Wir benutzten allso "x,y-10,?,y-5".
      An der Stelle von Fragezeichen wollen wir die Breite setzten, jedoch soll ja wenn die HP weniger wird, sich auch die Breite verändern, somit benutzten wir folgende Formel: x+(size/100*(hp/hp_max*100))
      Zum schluss schreiben wir bei "outline" false hin, denn wir wollen ja eine Fläche haben, und nicht nur Ränder

      Spoiler anzeigen

      GML-Quellcode

      1. {
      2. draw_sprite(sprite_index,-1,x,y);
      3. if (round(hp/hp_max*100) >= 50)
      4. draw_set_color(c_green);
      5. else if (round(hp/hp_max*100) <= 50 && round(hp/hp_max*100) >= 20)
      6. draw_set_color(c_yellow);
      7. else
      8. draw_set_color(c_red);
      9. draw_rectangle(x,y-10,x+(size/100*(hp/hp_max*100)),y-5,false);
      10. }
      Alles anzeigen


      Spoiler anzeigen
      Zur Rechnung:
      Fangen wir wieder mit der ersten Klammern an. Wieder ermitteln wir die aktuelle Prozentanzahl. Nehmen wir den Wert aus den Obigen Beispiel: 56%.
      Nun nehmen wir den Wert der Variable "size", der ja die Breite des Sprites, vom Objekt ist, geteilt durch 100 (nehmen wir mal an, das Sprite ist 32 Pixel breit). Raus kämme 0,32. Wenn wir nun diese 0,32 Pixel mal die Prozent anzahl nehemen (56) griegen wir 17,92 Pixel raus. Wir rechnen also zu allr erst aus Wie viel Pixel 1 HP hat, und nehmen es dann mal die momentanen HP. Somit haben wir die Breite


      Zum schluss, wechseln wir mit draw_set_color() unsere Farbe auf schwart (c_black) um den Rand zu zeichnen. Nun nehmen wir wieder draw_rectangle und x1, ist gleich x, y1 ist auch wieder y-10, somit haben wir den gleichen Start Punkt. Jedoch soll der Rand bei HP verlust nicht mit zurüclgehen, somit ist x2 ganz einfach x+size, also die Startposition, plus die Breite des Bildes, und y2 wieder y-5.
      Kleiner unterschied: Diesesmal schreiben wir bei "outline" true, denn wir wollen nur einen Rand zeichnen, und keine Gefüllte fläche.

      Das ganze sieht dann so aus:

      GML-Quellcode

      1. {
      2. draw_sprite(sprite_index,-1,x,y);
      3. if (round(hp/hp_max*100) >= 50)
      4. draw_set_color(c_green);
      5. else if (round(hp/hp_max*100) <= 50 && round(hp/hp_max*100) >= 20)
      6. draw_set_color(c_yellow);
      7. else
      8. draw_set_color(c_red);
      9. draw_rectangle(x,y-10,x+(size/100*(hp/hp_max*100)),y-5,false);
      10. draw_set_color(c_black);
      11. draw_rectangle(x,y-10,x+size,y-5,true);
      12. }
      Alles anzeigen


      So jetzt sollten sogar D&D Leute das verstanden habe,... hoffe ich zumindestens.

      Im Anhang ist auch noch ein Beispiel, wobei ich dort auch noch ein "Mouse Click Left" Event erstellt habe, um zu zeigen wie das Aussieht wenn das Objekt HP verliert, und ein "Step" Event, dass das Objekt zerstört wenn die HP kleiner als 1 ist (also 0).

      MFG
      Metalknight
      Dateien
    • Denke ich auch gerade. Ich glaube hier ist einem zwar offensichtlicher wie alles funktioniert, weil man alles selbst aufruft, aber insgesamt passiert nahezu dasselbe wie bei der "draw healthbar"-Methode. Aber immerhin hat man hier auf diese Weise freien Zugriff auf alles und kann Problemlos Änderungen anbringen. Zum Beispiel kann man hier ja ohne weiteres eine vertikale Healthbar machen (wozu auch immer). Ich weiß nicht, ob das bei der vorgeproggten vom GM auch so ohne weiteres möglich ist.
    • der nachteil der draw-healthbar methode ist aber, dass man nur eine einzige machen kann.
      wenn man in seinem spiel zum beispiel healthbars für mehrere objekte anzeigen lassen will kommt man mit der funktion net aus...

      MfG Waterman7
    • Foo schrieb:

      Also ich hab in einem meiner Spiele drei Healthbars ohne Probleme am laufen.
      ??? Was das geht mit der Funktionen???
      Ich dachte auch immer man kann mit der nur eine Healthbar machen, deswegen habe ich das hir eigentlich Hauptsächlich gemacht.

      MFG
      Metalknight
    • Ähm... Klar geht das mit den GM-Integrierten Funktionen!?
      Ganz einfach sogar:

      GML-Quellcode

      1. // Wenn du die Energie von Player1 und die Energie von Player2 in einer Healthbar anzeigen lassen möchtest:
      2. draw_healthbar(10,10,110,20,global.score_p1,c_white,c_red,c_green,0,true,true);
      3. draw_healthbar(10,30,110,40,global.score_p2,c_white,c_red,c_green,0,true,true);
      fabse64 -> haiyyu
    • fabse64 schrieb:

      Ähm... Klar geht das mit den GM-Integrierten Funktionen!?
      Ganz einfach sogar:

      GML-Quellcode

      1. // Wenn du die Energie von Player1 und die Energie von Player2 in einer Healthbar anzeigen lassen möchtest:
      2. draw_healthbar(10,10,110,20,global.score_p1,c_white,c_red,c_green,0,true,true);
      3. draw_healthbar(10,30,110,40,global.score_p2,c_white,c_red,c_green,0,true,true);


      Du musst aber trotzdem Variablen verwenden.
      Mit set health bei D&D funkt das nicht.
      Das Tutorial ist also schon ganz richtig.



    • frischideu schrieb:

      fabse64 schrieb:

      Ähm... Klar geht das mit den GM-Integrierten Funktionen!?
      Ganz einfach sogar:

      GML-Quellcode

      1. // Wenn du die Energie von Player1 und die Energie von Player2 in einer Healthbar anzeigen lassen möchtest:
      2. draw_healthbar(10,10,110,20,global.score_p1,c_white,c_red,c_green,0,true,true);
      3. draw_healthbar(10,30,110,40,global.score_p2,c_white,c_red,c_green,0,true,true);


      Du musst aber trotzdem Variablen verwenden.
      Mit set health bei D&D funkt das nicht.
      Das Tutorial ist also schon ganz richtig.


      Das Tutorial ist zwar gut aber der Zweck ist sinnlos:

      Man kann zwar mit D&D nur eine machen, aber 2 Zeilen GML für 2 healthbars ist wohl einfacher für Anfänger als 10 für eine in diesem tutorial. :rolleyes:
    • ghostrider schrieb:


      frischideu schrieb:


      fabse64 schrieb:

      Ähm... Klar geht das mit den GM-Integrierten Funktionen!?
      Ganz einfach sogar:

      GML-Quellcode

      1. // Wenn du die Energie von Player1 und die Energie von Player2 in einer Healthbar anzeigen lassen möchtest:
      2. draw_healthbar(10,10,110,20,global.score_p1,c_white,c_red,c_green,0,true,true);
      3. draw_healthbar(10,30,110,40,global.score_p2,c_white,c_red,c_green,0,true,true);


      Du musst aber trotzdem Variablen verwenden.
      Mit set health bei D&D funkt das nicht.
      Das Tutorial ist also schon ganz richtig.


      Das Tutorial ist zwar gut aber der Zweck ist sinnlos:

      Man kann zwar mit D&D nur eine machen, aber 2 Zeilen GML für 2 healthbars ist wohl einfacher für Anfänger als 10 für eine in diesem tutorial. :rolleyes:
      Yah wie schon gesagt, wusste selber nicht, dass das so geht. Deswgen habe ich dashier geschrieben ;D

      MFG
      Metalknight
    • Foo schrieb:

      Achso - denkt immer daran - wenns auf Performance ankommt:
      GM-Funktionen sind schneller als Eigenimplementationen.
      Das hätte ich gerne begründet, liegt es daran, dass die GM-Funktionen nicht erst von GML -> Irgendwas -> Maschienensprache konvertiert werden müssen oder hat das nen anderen Grund?
      So far, Schattenphoenix~
      _____________________________________________________________________________
      "Who needs a stairway to heaven...
      If there is an elevator to hell... ?
      "
      - Vergessen
      "Auch ein perfektes Chaos ist etwas vollkommenes."
      - Jean Genet