Zuweisen der einzelnen Sprites zu einzelnen Aktionen.

  • GM 8

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

  • Zuweisen der einzelnen Sprites zu einzelnen Aktionen.

    Servus Community,
    für ein Sidescrolling Platformer benötige ich einen Charakter, dessen Sprite sich immer zu jeder Aktion die er grade tut verändert.
    Bissher kann er nach Links und Rechts laufen, Springen und Fallen, halt der Standart.

    Dieses ganze Movement habe ich mit einen Code im Step des Players geregelt. Das ganze schaut so aus :

    GML-Quellcode

    1. image_speed = global.PlayerImageSpeed//Überprüft ob der Player Fällt oder grade Springtif vspeed < 0 { global.PlayerJumping = 1 global.PlayerFalling = 0 }
    2. if vspeed > 0 { global.PlayerJumping = 0 global.PlayerFalling = 1 }
    3. if speed = 0 { global.PlayerJumping = 0 global.PlayerFalling = 0 }
    4. //Ist der Player in der Luft?if place_free(x,y + 1) { gravity = 0.5 }else { gravity = 0.0 }
    5. if keyboard_check(ord('A')) and !keyboard_check(ord('D')) { if place_free(x - global.PlayerMoveSpeed,y) { //Der Spieler hält also A und nicht D gedrückt. global.PlayerIdleLeft = 0 global.PlayerIdleRight = 0 global.PlayerMoveLeft = 1 //Der Player rennt nach Links. global.PlayerMoveRight = 0 x -= global.PlayerMoveSpeed //Bewegt den Spieler in die angegebene Richtung. } else { global.PlayerIdleLeft = 1 //Links ist eine Wand? Bleib stehen und guck nach Links. global.PlayerIdleRight = 0 global.PlayerMoveLeft = 0 global.PlayerMoveRight = 0 } } if keyboard_check(ord('D')) and !keyboard_check(ord('A')) { if place_free(x + global.PlayerMoveSpeed,y) { //Der Spieler hält also A und nicht D gedrückt. global.PlayerIdleLeft = 0 global.PlayerIdleRight = 0 global.PlayerMoveLeft = 0 global.PlayerMoveRight = 1 //Der Player rennt nach Rechts. x += global.PlayerMoveSpeed //Bewegt den Spieler in die angegebene Richtung. } else { global.PlayerIdleLeft = 0 global.PlayerIdleRight = 1 //Rechts ist eine Wand? Bleib stehen und guck nach Rechts. global.PlayerMoveLeft = 0 global.PlayerMoveRight = 0 } } if keyboard_check(ord('D')) and keyboard_check(ord('A')) { global.PlayerIdleLeft = 0 global.PlayerIdleRight = 1 //Rechts ist eine Wand? Bleib stehen und guck nach Rechts. global.PlayerMoveLeft = 0 global.PlayerMoveRight = 0 }
    6. if keyboard_check_pressed(ord('W')){ if !place_free(x,y + 1) { vspeed = -global.PlayerJumpFirst } else if keyboard_check_pressed(ord('W')) && global.PlayerJumpTwice = 1 { global.PlayerJumpTwice = 0 vspeed = -global.PlayerJumpSecond }}
    7. if keyboard_check_released(ord('W')) // Checks if the player releases 'W'{ if vspeed < 0 // Checks if the player is about to jump in the air { vspeed /= 2 // Sets it so that depending on how long the player presses and releases 'W', that's how high the player jumps }}


    Mit den Variablen welche hier verwendet werden werden den Charakter auch verschiedene Sprites zugewiesen.
    Das Ganze läuft erneut über einen Code im Step des Players und schaut so aus :

    GML-Quellcode

    1. if global.PlayerMoveLeft = 1 && global.PlayerMoveRight = 0 && global.PlayerIdleLeft = 0 && global.PlayerIdleRight = 0 && global.PlayerJumping = 0 && global.PlayerFalling = 0 { sprite_index = spr_player_runL image_speed = 3 }
    2. if global.PlayerMoveLeft = 0 && global.PlayerMoveRight = 1 && global.PlayerIdleLeft = 0 && global.PlayerIdleRight = 0 && global.PlayerJumping = 0 && global.PlayerFalling = 0 { sprite_index = spr_player_runR image_speed = 3 }
    3. if global.PlayerMoveLeft = 0 && global.PlayerMoveRight = 0 && global.PlayerIdleLeft = 1 && global.PlayerIdleRight = 0 && global.PlayerJumping = 0 && global.PlayerFalling = 0 { sprite_index = spr_player_idleL image_speed = 2 }
    4. if global.PlayerMoveLeft = 0 && global.PlayerMoveRight = 0 && global.PlayerIdleLeft = 0 && global.PlayerIdleRight = 1 && global.PlayerJumping = 0 && global.PlayerFalling = 0 { sprite_index = spr_player_idleR image_speed = 2 } if global.PlayerMoveLeft = 1 || global.PlayerIdleLeft = 1 { if global.PlayerJumping = 1 && global.PlayerFalling = 0
    5. { sprite_index = spr_player_jumpL image_speed = 2 } }
    6. if global.PlayerMoveRight = 1 || global.PlayerIdleRight = 1 { if global.PlayerJumping = 1 && global.PlayerFalling = 0
    7. { sprite_index = spr_player_jumpR image_speed = 2 } } if global.PlayerMoveLeft = 1 || global.PlayerIdleLeft = 1 { if global.PlayerFalling = 1 && global.PlayerJumping = 0
    8. { sprite_index = spr_player_fallL image_speed = 2 } }
    9. if global.PlayerMoveRight = 1 || global.PlayerIdleRight = 1 { if global.PlayerFalling = 1 && global.PlayerJumping = 0
    10. { sprite_index = spr_player_fallR image_speed = 2 } } if hspeed = 0 { if global.PlayerMoveRight = 1 { global.PlayerIdleRight = 1 global.PlayerMoveRight = 0 } else if global.PlayerMoveLeft = 1 { global.PlayerIdleLeft = 1 global.PlayerMoveLeft = 0 } }



    so.. Mein Problem ist nun, das die Sprite in ihrer Animation immer im ersten Bild direkt hängen bleibt. Ich habe schon eine Vermutung , woran das liegen könnte, undzwar das die Aktion, die Sprite zu verändern immer wieder aufgerufen wird, da es sich im Stepevent befindet.

    Wie genau könnte ich das umgehen?

    LG Marvin159

    EDIT//: Die Formatierung des Codes haut nicht richtig hin? Dafür gibts die Script nochmal fein und ordentlich als Textdatei im Anhang :).
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Marvin159 ()

  • Leg doch einfach eine neue Variable die den aktuellen Character Status beinhaltet.
    Jedes mal wenn sich das Sprite ändern soll, wird diese variable zu einem anderen Wert gesetzt (0 für links, 1 für rechts- es bieten sich konstanten an!). Im Step Event schreibst du etwa sowas:

    GML-Quellcode

    1. var spr;
    2. switch (character_spr_status)
    3. {
    4. case 0://links stehen
    5. spr=links_stehen_spr
    6. break;
    7. }
    8. if (sprite_index!=spr) {sprite_index=spr;}//so wird es nur 1 mal geändert!

    hoffe das hilft.
    die variable spr ist nur damit du nicht so viel tippen musst :D.
    Ich hoffe da ist nicht zu viel unnötiges Zeug dabei :D

    EIDT: Sry aber das war gerade totaler Blödsinn:
    Falls es tasächlich daran liegt das das spirte index andauern neu verteilt wird, mach es lieber so:
    Wenn sich das sprite ändern soll, wie oben character_spr=aktuelles spr

    im step event

    if (sprite_index!=character_spr) {sprite_index=character_spr;}

    damit sparst du dir 1ne varieble und code zeilen :D.

    Andere Möglichkeit:
    Du veränderst das sprite nur im keyboard pressed event. Mit der Ersten Lösung gehts aber IMMER.
  • Wie Partik schon am Ende seines Posts vorgeschlagen hat, reicht es, beim ändern des Sprites zu überprüfen, ob es nicht bereits dieses Sprite als Index benutzt, also

    GML-Quellcode

    1. if (sprite_index != spr_spring)
    2. sprite_index = spr_spring;

    © 2008 by Teamgrill Productions
  • BEi den Wenigen Technik Fragen stürz ich mich ja gerade zu darauf !:D

    Aber es sei auch angemerkt, das es ein bisschen umständlich und vorallem performance lastig ist das in jedem step zu tun währen gedrückt wird. Es ist genauso codesparender(und somit übersichtlicher) das einmal zentral zu tun, mit einer kleinen Codezeile. Ausserdem Hilft es dir Situationen zu meistern, wenn z.B der Player läuft UND etwas anderes tut, über die bestehende variable abzufragen, welcher vorgang schon abläuft.
  • MasterXY schrieb:

    if (sprite_index != spr_spring)
    sprite_index = spr_spring;
    Alles klar, danke euch beiden :)
    Ich probiere das obrige Beispiel mal aus, ich hatte anfangs hinter der Variablen Abfrage noch sowas wie "&& !sprite_index = xyz" hinzugefügt, aber da war das ! wohl an der falschen stelle :P

    Es wundert mich stark, denn es funktioniert immernoch nicht, die Fehler Quelle kann ich jetzt auch nicht mehr wirklich nachvollziehen..
    Die Zeile schaut für jede Sprite jetzt wie folgt aus : (z.b. Idle Left)



    if global.PlayerMoveLeft = 0 && global.PlayerMoveRight = 0 && global.PlayerIdleLeft = 1 && global.PlayerIdleRight = 0 && global.PlayerJumping = 0 && global.PlayerFalling = 0
    {
    if (sprite_index != spr_player_idleL)
    {
    sprite_index = spr_player_idleL;
    }
    image_speed = 2
    }
    LG Marvin159

    Haut jetzt hin, ich habe image_speed auch in die Abfrage der sprite mit einbezogen.

    Danke vielmals!

    LG Marvin159

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Marvin159 ()

  • Partik schrieb:

    BEi den Wenigen Technik Fragen stürz ich mich ja gerade zu darauf !:D

    Aber es sei auch angemerkt, das es ein bisschen umständlich und vorallem performance lastig ist das in jedem step zu tun währen gedrückt wird. Es ist genauso codesparender(und somit übersichtlicher) das einmal zentral zu tun, mit einer kleinen Codezeile. Ausserdem Hilft es dir Situationen zu meistern, wenn z.B der Player läuft UND etwas anderes tut, über die bestehende variable abzufragen, welcher vorgang schon abläuft.
    das habe ich bei der Spring und Fall Spirtes benutzt :
    Die Variablennamen weiß ich grade nicht direkt, hab mein Projekt nicht auf..

    if global.PlayerJumping = 1 && sprite_index! = spr_player_jump_left && global.PlayerMoveLeft = 1|| global.PlayerIdleLeft = 1
    {
    sprite_index = spr_player_jump_left
    image_speed = 2
    }

    so ungefähr sollte es da ausschauen :P
  • Benutzer online 1

    1 Besucher