Brauche hilfe mit der healthbar auf zeit!

  • GM 8

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

  • Brauche hilfe mit der healthbar auf zeit!

    Hallo an alle. Bin neu hier, also stell ich mich erst einmal vor: Ich heiße Stan, bin 26 und arbeite seid paar jahren mit Game Maker, Unity und anderen programmen der Spiele Programmierung!
    Arbeite mit GMStudio für Android!
    Zu meiner Frage: In meinem spiel schwimmt man, und wenn man taucht soll eine healthbar erscheinen die mit der zeit weniger wird, z.B. alle 5 sekunden. Und genau das krieg ich nicht hin. Ich habs mit alarm versucht aber irgendwie klappt es nicht. Bitte um rat, und wenn es geht um einen code den ich einfach einfüge. Seid drei tagen sitze ich schon daran. :wacko:

    Danke!
  • Hej Stan. Willkommen in der Community.

    Dein Problem ist so eigentlich recht leicht zu lösen. Ich nehm jetzt mal an, dass schwimmen und etc. alles funktioniert. Das Erste was du brauchst ist eine Überprüfung ob der Spieler gerade schwimmt.

    GML-Quellcode

    1. if(instance_place(x,y,obj_water)) {
    2. }


    Wie auch immer du dieses IF machst, auf jeden Fall muss der Wert true sein, wenn der Spieler gerade schwimmt bzw. taucht. Dann geht es weiter. Du musst ebenso überprüfen ob der Timer gesetzt worden ist oder nicht. Falls er nicht gesetzt worden ist, dann setzt du ihn. Falls er gesetzt worden ist, machst du garnix.

    GML-Quellcode

    1. if(instance_place(x,y,obj_water) && alarm[0] < 0) {
    2. alarm[0] = 5 * room_speed; //5 Sekunden
    3. }


    So jetzt bist du sicher, dass du ihm Wasser bist und der Timer nicht gesetzt worden ist. Natürlich wird der Timer dann auf 5 Sekunden gesetzt. Im Timer-Auslös-Event zählst du deine Healthbar um 1 runter. Das zeichnen übernimmst du dann im draw event. Das sollte dann ca so aussehen.

    GML-Quellcode

    1. if(instance_place(x,y,obj_water)) {
    2. //Draw-Code
    3. }


    Da du GM schon ein paar Jahre verwendest, solltest du damit klar kommen. Wenn nicht schreib ich genauer, wie das ca. aussehen sollte.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ok. Ich bezeichne diesen Wert jetzt mal als "Leben". (Der Code ist alles aus dem Kopf und nicht getestet. Es könnte passieren, dass mir ein oder zwei Fehler unterlaufen) Das ganze sieht jetzt so aus:

    :event_create: Im Create-Event

    GML-Quellcode

    1. live = 100; //Derzeitiges Leben
    2. live_max = 100; //Maximales Leben
    3. alarm[0] = 5 * room_speed; //in 5 Sekunden soll der Timer los gehen


    :event_timer: Im Alarm[0]-Event

    GML-Quellcode

    1. live -= 1;
    2. alarm[0] = 5 * room_speed;



    :event_draw: Im Draw-Event

    GML-Quellcode

    1. draw_set_color(c_white);
    2. draw_rectangle(0,0,128, 16, false);
    3. draw_set_color(c_blue);
    4. draw_rectangle(0,0,128*live/live_max, 16, false);


    :event_step: Im Step-Event

    GML-Quellcode

    1. if(position_meeting(x,y,obj_einsammel_object)) {
    2. live += 1;
    3. }


    Das sollte jetzt so ca. funktionieren. Im Step-Event wird die Kollision überprüft. Gegebenenfalls müsstest du die Instanz noch zerstören, aber ich weiß nicht genau wie du das willst.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • EDIT: Hoppla da war ich mal langsam XD also hier hast du einen zweiten Ansatz bei dem sich pro step und nicht pro alarm etwas verändert:

    Also deine simpelste healthbar ist:

    GML-Quellcode

    1. draw_rectangle(x1,y1,x2,y2,outline)

    x1 und y1 bilden die linke obere Ecke deiner healthbar also bei einer länge von 100 pixel maximal x-50,y
    x2 ist dann der aktuelle Stand der healthbar also ein wert zwischen x-50+100 und x-50+0; das wäre dann logischerweise ein variable wie luft oder health
    y2 ist dann die Dicke und outline ob das rechteck gefüllt oder nur 4 Striche ist

    deine varable luft wird dann so behandelt:

    GML-Quellcode

    1. ///create Event
    2. luft = 100*room_speed;
    3. abzug = 1 //<-- wieviel pro step abgezogen wird; mal roomspeed gibt dir den abzug pro sekunde
    4. ///step event
    5. luft -= abzug;
    6. if luft <= 0
    7. {
    8. //keine luft mehr - Fail condition - tot - etc
    9. }
    10. if place_meeting(x,y,obj_powerup)
    11. {
    12. luft += 100*roomspeed/4; //ein viertel der healthbar wieder auffüllen
    13. }
    14. //und am Ende den Wert in einem bestimmten bereich halten, damit es nie weniger als 0 oder mehr als 100 wird
    15. luft = clamp(luft, 0, 100);
    16. ///draw-event
    17. draw_rectangle(x-50,y,(x-50)+luft,y+4,0);
    Alles anzeigen

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Wenn du das Draw-Event verwendest, wird der Standard-Draw von dem Spieler nicht ausgeführt. Schreib im Draw-Event als erste Zeile

    GML-Quellcode

    1. draw_sprite(sprite_index,image_index,x,y);
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Dann musst du noch

    GML-Quellcode

    1. draw_self();

    ganz am Anfang ins Draw Event setzen

    In Studio überschreibt jeder Draw Befehl den "ursprünglichen Drawbefehl" des Sprites das du im Editor zuweist. Mit Draw self zeichent er auch zuerst dein zugewiesenes Sprite und dann erst alles andere was noch in dem Objekt gezeichnet werden soll.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • LifeGpDA schrieb:

    Darf ich noch um was bitten? :)

    Wenn es nichts mehr mit diesem Problem zu tun hat, solltest du einen neuen Thread erstellen, damit Leute die ein ähnliches Problem haben die Lösung dann auch finden können.
    Möglicherweise existiert aber schon eine Lösung. Wenn du aus der Gamemaker-Hilfe nicht schlau geworden bist, und deine Suchanfragen nicht das gewünschte Ergebnis liefern,
    dann kannst du ruhig ein neues Thema erstellen.