Wie mache ich eine Tür-Animation?

    Wie mache ich eine Tür-Animation?

    Hallo zusammen
    Ja der Titel sagt es schon, ich möchte wissen ob jemand ein Tutorial kennt wie man eine Türanimation richtig hinbekommt, sodass die Frames nur einmal abgespielt werden
    und beim letzten stehen bleiben.
    Wie gesagt, es geht nur um die Animation, nicht um den teleport.

    Vielen Dank :)
    Hallo,
    Als erstes musst du wissen wie viele animationsschritte die Tür hat. Dann einen image_speed festlegen.
    Ein custom index tracker für frame perfekte animation.
    create:

    GML-Quellcode

    1. max_index = sprite_get_number(sprite_index);
    2. cur_index = 0;
    3. image_speed = 0.20;
    4. closed = true;


    Dann im Draw event:

    GML-Quellcode

    1. if (closed)
    2. {
    3. cur_index += image_speed;
    4. if (cur_index > max_index-1)
    5. {
    6. image_speed = 0;
    7. image_index = max_index-1;
    8. cur_index = max_index-1;
    9. closed = false;
    10. }
    11. }
    12. else
    13. {
    14. cur_index -= image_speed;
    15. if (cur_index < 0)
    16. {
    17. image_speed = 0;
    18. image_index = 0;
    19. cur_index = 0;
    20. closed = true;
    21. }
    22. }
    23. draw_sprite(sprite_index, cur_index, x, y);

    Matt Mats schrieb:

    Das hat bei mir nicht funktioniert, die tür hat sich von alleine geöffnet

    Hab ich mir grad auch gedacht das ich was vergessen hab.
    Hast du zufälligerweise ein Objekt das so für alles zuständig ist, wie z.B. ein HUD oder ein Kontroll objekt.
    Dort könntest du ein enum festlegen
    create:

    GML-Quellcode

    1. enum door {closed, opening, opened, closing}


    Tür Objekt
    create:

    GML-Quellcode

    1. state = door.closed;
    2. max_index = sprite_get_number(sprite_index)-1;
    3. cur_index = 0;
    4. image_speed = 0;


    draw:

    GML-Quellcode

    1. switch (state)
    2. {
    3. case door.closed:
    4. if (keyboard_check_pressed(vk_space))
    5. {
    6. if (point_distance(x, y, obj_player.x, obj_player.y) < 32)
    7. {
    8. state = door.opening;
    9. image_speed = 0.2;
    10. }
    11. }
    12. break;
    13. case door.opened:
    14. if (point_distance(x, y, obj_player.x, obj_player.y) > 32)
    15. {
    16. state = door.closing;
    17. image_speed = 0.2;
    18. }
    19. break;
    20. case door.closing:
    21. cur_index -= image_speed;
    22. if (cur_index <= 0)
    23. {
    24. image_speed = 0;
    25. cur_index = 0;
    26. state = door.closed;
    27. }
    28. break;
    29. case door.opening:
    30. cur_index += image_speed;
    31. if (cur_index >= max_index)
    32. {
    33. image_speed = 0;
    34. cur_index = max_index;
    35. state = door.opened;
    36. }
    37. break;
    38. }
    39. draw_sprite(sprite_index, cur_index, x, y);


    Prinzip:
    Wenn der Spieler [space] drückt und näher als 32 pixel von der Tür ist, geht sie auf. Wenn die Tür fertig ist mit öffnen checkt sie die Distanz des Spielers nochmals und schliesst sich automatisch bei einer zu grossen Distanz. Der Zyklus kann von hier wiederholt werden.

    Matt Mats schrieb:

    Irgendwie funktioniert das nicht wirklich, es reagiert erst wenn ich oben links in der wand stehe.
    Wie kann ich denn genau einstellen, dass der spieler 16 pixel vor der tür stehen muss?


    Ich glaub du hast den origin der Tür auf x=0 und y=0. Nachvollziehbar, muss ich bei meinem Code anpassen. Ich nehm an die Tür ist 16 x 16 pixel.
    Das heisst bei den zeilen 6 und 15 in meinem code must du

    GML-Quellcode

    1. point_distance(x, y, obj_player.x, obj_player.y)

    durch

    GML-Quellcode

    1. point_distance(x+8, y+8, obj_player.x, obj_player.y)

    ersetzen.
    Dann kommt der Abstand auf den Mittelpunkt der Tür an.

    Matt Mats schrieb:

    Ne die Tür ist 64 x 42 groß,
    die Collisionmask hab ich genau wie beim Spieler:
    8 , 23
    48, 63

    Ist eigentlich nicht wichtig wie die maske der Tür ist, du kannst sie auch ausgefüllt lassen. Wichtig ist der Mittelpunkt der Tür, wenn er bei 0, 0 ist (was ich vermute, da man die Tür sonst kaum platzieren kann)
    muss der point_distance folgende Offsets haben

    GML-Quellcode

    1. point_distance(x+32, y+32, obj_player.x, obj_player.y)

    Hab sogar noch ein wenig drauf getan beim y offset, da ich glaube das die Tür ähnlich wie der Spieler 2.5D ist.

    Matt Mats schrieb:

    Ich habs jetzt auf x32 und y64 gestellt, soweit geht es, nur bleibt die Tür nicht offen sondern schließt sich wieder


    Hab es so geschrieben dass sie bei Entfernung von alleine schliesst.
    Bei dem case door.opened:

    GML-Quellcode

    1. case door.opened:
    2. if (keyboard_check_pressed(vk_space))
    3. {
    4. if (point_distance(x+32, y+32, obj_player.x, obj_player.y) < 32)
    5. {
    6. state = door.closing;
    7. image_speed = 0.2;
    8. }
    9. }
    10. break;


    Da musst du die Tür selbst schliessen