2D Platformer: Schlagen mit Animation

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

  • kurze Sachen im Vorraus:
    sprite_index: Das Sprite, welches gerade beim Objekt zu sehen ist
    image_index: Das angezeigte Frame vom Sprite
    image_number: Die Anzahl der Frames vom Sprite
    image_speed: Bilder pro Step, soll heißen, wie schnell die Animation abgespielt wird


    So als erstes brauchst du natürlich eine Taste, die das schlagen auslöst. Ich nehme jetzt einfach mal die Leertaste.
    Um eine Tastatureingabe auszulesen, wenn der Spieler die Taste eindrückt, brauchen wir die Funktion
    keyboard_check_pressed(key)
    Hier brauchen wir den Parameter key. Der ist dazu da, um abzufragen, ob eine bestimmte Taste gedrückt worden ist. In unserem Fall die Leertaste. Es gibt dafür sogenannte Konstanten. Es sind Variablen, die sozusagen schreibgeschützt sind.
    In unserem Fall heißt der Key vk_space.
    Die Funktion gibt true oder false aus. Wenn die Taste eingedrückt wird, true ansonsten false.
    Um das abzufragen brauchen wir if(Bedingung)
    wenn in den Klammern vom if true heraus kommt, dann wird der Befehl bzw. das in den geschweiften Klammern dahinter ausgeführt. (Nur noch mal ausführlich ;) )
    So unser Code bis jetzt (im Step):

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_space)){
    2. //Code
    3. }

    Alles was hinter den // steht ist ein Kommentar und wird nicht als Befehl oder sonstiges angesehen
    Als nächstes müssen wir das Sprite für's schlagen einbinden. Wie ich ganz oben geschrieben habe, können wir dazu sprite_index benutzen.
    Hinweis: Du hast ja extra 2 Sprites, einmal für links und einmal für rechts. Das ganze kannst du ohne machen und mit image_xscale umgehen.
    image_xscale = -1; Spiegelt das Sprite. Das kannst du einfach im Bewegungscode von dir so machen, dass sich anstatt das Sprite, image_xscale verändert. Dadurch musst du auch beim Schlagen nicht mehr auf die guck Richtung achten.
    Danach müssen wir noch die Animation starten. Dazu setzen wir image_speed auf 1 um den Normalen Speed zu haben. Wenn du zB. 0.5 nimmst, ist es nur der Halbe Speed. Musst du dann schauen, wie schnell es am besten sein soll.
    So der Code erweitert:

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_space)){ //Wenn Leertaste gedrückt wurde
    2. sprite_index = spr_player_hit; //Der Name vom Sprite
    3. image_speed = 1; //Der Speed der Animation
    4. }

    So als nächstes müssen wir dann während der Animation schauen, ob ein Gegner dabei getroffen wurde.
    Dazu können wir die Funktion instance_place(x,y, obj) benutzen.
    Es wird die Kollision vom Objekt der x,y Koordinate mit dem Objekt obj abgefragt.
    Wenn eine Collision stattgefunden hat, wird die ID des Objektes zurückgegeben, womit wir gezielt genau dieses eine Objekt ansprechen können, welches uns berührt. Wenn aber keine Stattfand, wird noone zurückgegeben.
    Am besten speichert man dann den Wert von der Funktion in eine Variable ab. Ich mach das mit der Variable obj.
    Wenn wir eine Berührung haben, können wir mit dem With-Statement auf das Objekt mit der ID zugreifen und Code im diesem Objekt ausführen und somit auch eine Funktion bei dem benutzen, welche sich dann auch auf das Obj mit der ID bezieht.
    Das ganze geht so:

    GML-Quellcode

    1. with(objID){
    2. //Code
    3. }

    Um das Objekt zu zerstören gibt es die Funktion instance_destroy(). Diese zerstört das Objekt, in dem die Funktion ausgeführt wurde.
    Der ganze Code:

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_space)){ //Wenn Leertaste gedrückt wurde
    2. sprite_index = spr_player_hit; //Der Name vom Sprite
    3. image_speed = 1; //Der Speed der Animation
    4. }
    5. if (sprite_index == spr_player_hit){ //Wenn wir gerade beim Schlagen sind, also das Sprite fürs Schlagen aktiviert wurde
    6. obj = instance_place(x,y, obj_enemy); //Weisen wir obj die ID vom obj_enemy zu, wenn es den Spieler berührt.
    7. if (obj != noone){ //Wenn wir wirklich berührt wurden
    8. with(obj){//Gehe ins Objekt obj
    9. instance_destroy() //Zerstöre mich selber (Wir sind im Objekt obj)
    10. }
    11. }
    12. }
    Alles anzeigen


    Als letztes, müssen wir dann noch bei Ende der Animation, das Sprite wieder zurückstellen und alles wieder wie gehabt laufen lassen:
    wir fragen ab, ob das Frame wo wir grad sind größer oder gleich der Anzahl der Frames ist. Dann ist die Animation erst mal zuende gelaufen und soll nicht nochmal von neuem Anfangen.
    image_index fängt bei 0 an. Das heißt, dass bei 5 Frames, image_index bei 4 fertig ist. Deshalb gleich image_number-1
    Ganzer Code:

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_space)){ //Wenn Leertaste gedrückt wurde
    2. sprite_index = spr_player_hit; //Der Name vom Sprite
    3. image_speed = 1; //Der Speed der Animation
    4. }
    5. if (sprite_index == spr_player_hit){ //Wenn wir gerade beim Schlagen sind, also das Sprite fürs Schlagen aktiviert wurde
    6. obj = instance_place(x,y, obj_enemy); //Weisen wir obj die ID vom obj_enemy zu, wenn es den Spieler berührt.
    7. if (obj != noone){ //Wenn wir wirklich berührt wurden
    8. with(obj){//Gehe ins Objekt obj
    9. instance_destroy() //Zerstöre mich selber (Wir sind im Objekt obj)
    10. }
    11. }
    12. if (image_index >= image_number-1){ //Wenn die Animation fertig ist
    13. sprite_index = spr_player_normal; //Setze das Sprite wieder auf's normale ohne Schlagen
    14. image_index = 0; //Setze das Frame wieder auf 0
    15. image_speed = 0; //Und setze den Speed wieder auf 0, damit nicht das normale Sprite nicht direkt anfängt sich zu bewegen, ohne das man sich selber bewegt.
    16. }
    17. }
    Alles anzeigen


    So ich hoffe ich konnte dir helfen ;)
    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