Kein Neustart nach Sterbeanimation

  • GM 8

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

  • Kein Neustart nach Sterbeanimation

    Hallo liebe GM-Gemeinde,

    leider konnte ich in der Suchanfrage nichts zu meinem Problem finden. Auch bei Google oder Youtube nicht, daher hoffe ich, dass ihr mir auf diesem Wege helfen könnt. Mein Problem behandelt das spawnen zum letzten Checkpoint oder Neustart des Raumesa, nach einer Sterbeanimation. Ohne Sterbeanimation springt der Spieler sofort zum letzten Checkpoint, kein Problem. Nur sobald ich "Change Instance" erstelle, wechselt sich zwar der Sprite, aber der Spieler bleibt hängen und nichts tut sich mehr, außer dass die Gegner noch munter weiter hin und her laufen. Habe es auch mal mit einer Animation ala Super Mario versucht, indem der Spieler kurz hoch hüpft und dann nach unten aus dem Raum fällt. Auch danach bleibt der Screen an der Stelle stehen und ich muss das Spiel beenden. Ich habe festgelegt, dass wenn der Spieler seine Health verliert, er ein Leben abgezogen bekommt und danach "Jump to position: checkpointmaker.x, checkpointmaker.y) springt. Wie gesagt, ohne Animation klappt das ohne Probleme und mit bleibt das Spiel einfach hängen. Habe bereits versucht, der Sterbeanitmation zu sagen, dass wenn die Animation beendet ist zum Checkpointmaker zurück gesprungen werden soll, oder wenn der Spieler out of room ist, wie bei der Mario Sterbeanimation. Auch habe ich es versucht mit einer Kollision mit bestimmten Gegnern oder direkt über die Codierung beim Spieler. Alles ohne Erfolg und immer das selbe Problem.

    Mein Stepevent meines Spieler wegen der Health und Live Anzeige:

    :action_ifhealth: smaller than 1
    :action_begin:
    :action_lives: new lives: -1
    :action_health: 100
    :action_jumpposition: x: checkpointmaker.x, checkpointmaker.y
    :action_end:
    :action_iflives: equal to 0
    :action_begin:
    :action_roomother: Gameoverroom
    :action_end:

    Falls noch Informationen benötigt werden, reiche ich diese gerne nach.

    Und ich bedanke mich schon mal im Voraus für eure Hilfe.
  • Das Einzige was ich großartig im Code geschrieben habe, ist die Bewegung des Spielers, ansonsten habe ich anschließend fast ausschließlich vieles nur noch mit drap n drop gemacht


    hspeed = 0

    if keyboard_check(vk_right) // steuerung links-rechts
    {
    hspeed += 6
    laspressed = "left"
    }
    if keyboard_check(vk_left)
    {
    hspeed -= 6
    laspressed = "right"
    }
    if keyboard_check_pressed(ord("B"))
    if global.iteam1 > 0
    if instance_exists(powerschild) == false
    {
    global.iteam1 -= 1
    instance_create(x,y,powerschild)
    }
    if keyboard_check_pressed(vk_space)

    if instance_exists(schuss) == false
    {

    instance_create(x,y,schuss)

    }



    if place_free(x,y+10)
    { // wenn wir in der luft sind
    if laspressed = "left"
    sprite_index = sprite5
    else
    sprite_index = sprite6
    }
    else
    { // wenn wir auf dem boden sind
    if laspressed = "left"
    sprite_index = sprite0
    else
    sprite_index = sprite4

    }



    if place_free(x+hspeed,y) == false // kollisionserkennung links-rechts
    {
    if hspeed > 0
    move_contact_solid(0,-1)
    if hspeed < 0
    move_contact_solid(180,-1)
    hspeed = 0
    }

    vspeed += 1 // gravitation

    if keyboard_check_pressed(vk_up) // springen
    if place_free(x,y+10) == false
    vspeed -= 20

    if place_meeting(x,y,leiter) == true // Leiter
    {
    if keyboard_check(vk_up)
    vspeed = -5
    else if keyboard_check(vk_down)
    vspeed = 5
    else
    vspeed = 0
    }

    if place_free(x,y+vspeed) == false // kollisionserkennung oben-unten
    {
    if vspeed > 0
    move_contact_solid(270,-1)
    if vspeed < 0
    move_contact_solid(90,-1)
    vspeed = 0
    }

    if place_free(x+hspeed,y+vspeed) == false // Nicht an ecken hängen bleiben
    hspeed = 0

    if keyboard_check_released(vk_up) // sprunghöhe ändern
    if vspeed < 0
    vspeed /= 2

    image_index = x/30 // animation

    view_xview = ((x-view_wview/2)+view_xview*9)/10 // bildschirmausschnitt richtig einstellen
    view_yview = ((y-view_hview/1.5)+view_yview*9)/10

    if view_xview < 0 // view nicht aus dem raum raus
    view_xview = 0
    if view_yview < 0
    view_yview = 0
    if view_xview > room_width-view_wview
    view_xview = room_width-view_wview
    if view_yview > room_height-view_hview
    view_yview = room_height-view_hview
  • ich meine, ob ich oder jemand anderes anstatt drag and drop Coden sollen anstatt das auch in d&d zu schreiben

    Ps: Du kannst im Editor für eine Antwort auch alles Makieren und dann auf dieses gml Zeichen gehen, dann sieht das ein wenig übersichtlicher aus
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • husi012 schrieb:


    ich meine, ob ich oder jemand anderes anstatt drag and drop Coden sollen anstatt das auch in d&d zu schreiben

    Ps: Du kannst im Editor für eine Antwort auch alles Makieren und dann auf dieses gml Zeichen gehen, dann sieht das ein wenig übersichtlicher aus



    Ach so, ja klar gerne, bin für jede Hilfe dankbar, egal ob per code oder d&d
  • also ich sag es einfach mal, ich werde einfach nicht aus d&d schlau und würde deinen Code am besten verbessern,
    aber du müsstest eigentlich nur die Animation laufen lassen und dann im Event animation_end
    dieses jump hin schreiben
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • husi012 schrieb:

    ich meine, ob ich oder jemand anderes anstatt drag and drop Coden sollen anstatt das auch in d&d zu schreiben

    Ps: Du kannst im Editor für eine Antwort auch alles Makieren und dann auf dieses gml Zeichen gehen, dann sieht das ein wenig übersichtlicher aus

    husi012 schrieb:

    also ich sag es einfach mal, ich werde einfach nicht aus d&d schlau und würde deinen Code am besten verbessern,
    aber du müsstest eigentlich nur die Animation laufen lassen und dann im Event animation_end
    dieses jump hin schreiben


    Habe ich alles schon versucht. Der Screen bleibt einfach immer an der Stelle stehen und nichts passiert. Es sei denn ich sage, dass nach der Animation das Objekt wieder zum eigentlichen Spieler geendet wird, dann springt er zwar zum Checkpoint zurück und wechselt auch wieder zum Spielerobjekt, allerdings rutscht der Spieler dann langsam durch den Boden nach unten aus dem Raum. Da dies mein erstes Spiel ist und ich selber noch blutiger Anfänger bin und mir alles aus verschiedenen Tutorials zusammen geschustert habe, kann es natürlich sein, dass irgendwo ein Befehl versteckt ist, der sich mit diesem nicht verträgt. Aber ich wüsste nicht, woran es liegen sollte, wenn er ohne Probleme zum Checkpoint zurück springt und auch wie gewollt ein Leben reduziert, wenn ich ohne Animation von einem Gegner gekillt werde, aber sobald die Animation an ist, der Screen an der Stelle stehen bleibt wo ich gekillt wurde. Bin komplett ratlos! :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von D.Wayne ()

  • Falls das Problem noch bestehen sollte, möchte ich dir hier ein wenig Klarheit verschaffen.

    GML-Quellcode

    1. instance_change(obj, performevents)
    ist nicht zu empfehlen da es grade für Anfänger zu oben genannten Komplikationen und Missverständnissen kommen kann.
    Wenn wir uns die Funktion angucken, erkennen wir folgendes: Sie ändert die Instanz des Objektes, welches den Code ausführt zu einer anderen Instanz <obj>, zusätzlich wird hier als zweiter Parameter performevents gefragt, dieser kann entweder true oder false sein. Bei diesem Wechsel sollte dir im klaren sein, dass die Instanz nun zu einer anderen wird, also wenn ich beispielsweise obj_Becher in obj_Teller umwandle, dann hat der Teller nun eine andere Funktion als ein Becher (Bildlich beschrieben). Einfach gesagt, wird dein Code des eigentlichen Spielers nicht mehr ausgeführt, da er nun ja eine ganz andere Instanz ist (Der Index deines Spielers, mit dem die Instanz adressiert ist zeigt nun auf eine neue Instanz <obj> und die alte Instanz entfällt. Hierbei sollte performevents auf true gestellt sein,

    also in obj_Player:

    GML-Quellcode

    1. instance_change(obj_Player_tot, true);

    und in obj_Player_tot :

    GML-Quellcode

    1. //Create event:
    2. image_speed = 1; //setzt die Animationsgeschwindigkeit auf 1 Bild pro Step
    3. //////////////////////////////////////////////////////////////////////
    4. //Animation End event (Zu finden unter "other")
    5. instance_create(checkpointmaker.x, checkpointmaker.y, obj_Player); //erstellt einen neuen Spieler am Checkpoint
    6. instance_destroy(); //zerstört obj_Player_tot, da er nicht mehr gebraucht wird.


    Das ist nicht die eleganteste Methode, aber wahrscheinlich die für dich am einfachsten verständliche. Ich gehe davon aus, dass du weißt wie man eine Animation erstellt (mehrere images(Bilder) in einem Sprite ).
    Um dein Problem mit dem "Durchrutschen" zu adressieren, das ist auf deine Kollisionen zurückzuführen. Jetzt kann ich diese zwar nicht direkt beurteilen, da du dafür keinen Code /DnD gepostet hast, aber alleine

    GML-Quellcode

    1. if place_free(x,y+10)

    ist nicht die feine Britische Art.

    Ich werde dir anbei noch ein paar zeilen Code schreiben, wie ich die Sache angehen würde. Ich gehe mal davon aus das es sich um ein Platformer(Seitenansicht) handelt.

    GML-Quellcode

    1. //Im Create eine neue Variable für deinen Boden-Check erstellen
    2. grounded = false;
    3. //Im Step:
    4. grounded = (place_free(x,y+1));

    Dann kannst du im weiteren Kontext fragen ob grounded = true ist oder nicht.

    Für deine Kollisionen:
    Bitte KEINE Soliden Objekte benutzen, niemals NIE!

    du erstellst ein neues Objekt namens par_solid . Es muss nur existieren und braucht keinen Code oder ähnliches.
    In allen Sachen, die "fest" sein sollen, gibst du nun par_solid als parent an (Im Objektfenster unten links).

    Nun erstellst du in deinem Spieler ein collision event mit par_solid, dort fügst du folgenden code ein.

    GML-Quellcode

    1. var dist, dir, xdir, ydir;
    2. dist = point_distance(x, y, xprevious, yprevious);
    3. dir = degtorad(point_direction(xprevious, yprevious, x, y));
    4. xdir = cos(dir);
    5. ydir = -sin(dir);
    6. x = xprevious;
    7. y = yprevious;
    8. repeat (dist)
    9. {
    10. if (place_meeting(x + xdir, y, other.object_index))
    11. {
    12. hspeed = 0;
    13. }else{
    14. x += xdir;
    15. }
    16. if (place_meeting(x, y + ydir, other.object_index))
    17. {
    18. vspeed = 0;
    19. }else{
    20. y += ydir;
    21. }
    22. }
    Alles anzeigen

    Dies ist ein einfacher, dennoch bewährter Collision-code der die ganze Arbeit der Kollisionen für dich übernehmen wird.
    Bitte denke noch an folgende Sachen :
    Der Origin deines Spieler-Sprites sollte in der Mitte (center) sein, ausserdem sollte die Breite und am besten auch die Höhe des Sprites ungerade sein,
    also zB. 11x21 . Dies ist wichtig da bei geraden Werten kein Richtiger Mittelpunkt existiert.
    Unabhängig davon wie dein Spieler Sprite aussieht, sollte er keine "precise collisions" aktiviert haben. Du solltest ein Rechteck erstellen (msk_Player)
    (vorzugsweise die selbe größe des Spielersprites, auch gecentert). Im Spieler Objekt wählst du nun als "Mask" msk_Player aus.

    Bei weiteren Fragen stehe ich gerne zu Verfügung, bitte entschuldigt Rechtschreibfehler.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Rhazul schrieb:

    Falls das Problem noch bestehen sollte, möchte ich dir hier ein wenig Klarheit verschaffen.

    GML-Quellcode

    1. instance_change(obj, performevents)
    ist nicht zu empfehlen da es grade für Anfänger zu oben genannten Komplikationen und Missverständnissen kommen kann.
    Wenn wir uns die Funktion angucken, erkennen wir folgendes: Sie ändert die Instanz des Objektes, welches den Code ausführt zu einer anderen Instanz <obj>, zusätzlich wird hier als zweiter Parameter performevents gefragt, dieser kann entweder true oder false sein. Bei diesem Wechsel sollte dir im klaren sein, dass die Instanz nun zu einer anderen wird, also wenn ich beispielsweise obj_Becher in obj_Teller umwandle, dann hat der Teller nun eine andere Funktion als ein Becher (Bildlich beschrieben). Einfach gesagt, wird dein Code des eigentlichen Spielers nicht mehr ausgeführt, da er nun ja eine ganz andere Instanz ist (Der Index deines Spielers, mit dem die Instanz adressiert ist zeigt nun auf eine neue Instanz <obj> und die alte Instanz entfällt. Hierbei sollte performevents auf true gestellt sein,

    also in obj_Player:

    GML-Quellcode

    1. instance_change(obj_Player_tot, true);

    und in obj_Player_tot :

    GML-Quellcode

    1. //Create event:
    2. image_speed = 1; //setzt die Animationsgeschwindigkeit auf 1 Bild pro Step
    3. //////////////////////////////////////////////////////////////////////
    4. //Animation End event (Zu finden unter "other")
    5. instance_create(checkpointmaker.x, checkpointmaker.y, obj_Player); //erstellt einen neuen Spieler am Checkpoint
    6. instance_destroy(); //zerstört obj_Player_tot, da er nicht mehr gebraucht wird.


    Das ist nicht die eleganteste Methode, aber wahrscheinlich die für dich am einfachsten verständliche. Ich gehe davon aus, dass du weißt wie man eine Animation erstellt (mehrere images(Bilder) in einem Sprite ).
    Um dein Problem mit dem "Durchrutschen" zu adressieren, das ist auf deine Kollisionen zurückzuführen. Jetzt kann ich diese zwar nicht direkt beurteilen, da du dafür keinen Code /DnD gepostet hast, aber alleine

    GML-Quellcode

    1. if place_free(x,y+10)

    ist nicht die feine Britische Art.

    Ich werde dir anbei noch ein paar zeilen Code schreiben, wie ich die Sache angehen würde. Ich gehe mal davon aus das es sich um ein Platformer(Seitenansicht) handelt.

    GML-Quellcode

    1. //Im Create eine neue Variable für deinen Boden-Check erstellen
    2. grounded = false;
    3. //Im Step:
    4. grounded = (place_free(x,y+1));

    Dann kannst du im weiteren Kontext fragen ob grounded = true ist oder nicht.

    Für deine Kollisionen:
    Bitte KEINE Soliden Objekte benutzen, niemals NIE!

    du erstellst ein neues Objekt namens par_solid . Es muss nur existieren und braucht keinen Code oder ähnliches.
    In allen Sachen, die "fest" sein sollen, gibst du nun par_solid als parent an (Im Objektfenster unten links).

    Nun erstellst du in deinem Spieler ein collision event mit par_solid, dort fügst du folgenden code ein.

    GML-Quellcode

    1. var dist, dir, xdir, ydir;
    2. dist = point_distance(x, y, xprevious, yprevious);
    3. dir = degtorad(point_direction(xprevious, yprevious, x, y));
    4. xdir = cos(dir);
    5. ydir = -sin(dir);
    6. x = xprevious;
    7. y = yprevious;
    8. repeat (dist)
    9. {
    10. if (place_meeting(x + xdir, y, other.object_index))
    11. {
    12. hspeed = 0;
    13. }else{
    14. x += xdir;
    15. }
    16. if (place_meeting(x, y + ydir, other.object_index))
    17. {
    18. vspeed = 0;
    19. }else{
    20. y += ydir;
    21. }
    22. }
    Alles anzeigen

    Dies ist ein einfacher, dennoch bewährter Collision-code der die ganze Arbeit der Kollisionen für dich übernehmen wird.
    Bitte denke noch an folgende Sachen :
    Der Origin deines Spieler-Sprites sollte in der Mitte (center) sein, ausserdem sollte die Breite und am besten auch die Höhe des Sprites ungerade sein,
    also zB. 11x21 . Dies ist wichtig da bei geraden Werten kein Richtiger Mittelpunkt existiert.
    Unabhängig davon wie dein Spieler Sprite aussieht, sollte er keine "precise collisions" aktiviert haben. Du solltest ein Rechteck erstellen (msk_Player)
    (vorzugsweise die selbe größe des Spielersprites, auch gecentert). Im Spieler Objekt wählst du nun als "Mask" msk_Player aus.

    Bei weiteren Fragen stehe ich gerne zu Verfügung, bitte entschuldigt Rechtschreibfehler.




    Vielen lieben Dank für die Mühe die Du Dir gemacht hast. Leider klappt es nicht. Vielleicht habe ich es auch nicht so ganz verstanden, aber wenn ich so vor gehe und das Spiel starte, steht mein Spieler in der Luft und spielt ununterbrochen die Sterbeanimation ab.