Godot - Jeu de plateformes 2D

Gestion des animations

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Sommaire

Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.

II. Vidéo


Godot Engine - Jeu de plateformes 2D - Gestion des animations


III. Résumé

Dans cet épisode, nous intégrons dans le jeu, les animations créées dans l'épisode précédent.

III-A. Intégration du personnage

Dans la sous-scène du joueur, nous remplaçons le sprite du carré bleu par la sous-scène du personnage animé. Ensuite, nous devons redimensionner le nouveau sprite puis modifier la forme de collision. Nous remplaçons le rectangle de collision par une capsule, plus adéquate pour un personnage.

Ne modifiez jamais la propriété « scale » du nœud « CollisionShape2D ». Modifiez la ressource associée à la propriété « Shape » à la place.

III-B. Jouer les animations par le script

Évidemment, pour pouvoir contrôler les animations, il faut récupérer l'accès au nœud « AnimationPlayer » du sprite du personnage.

Pour jouer une animation, nous utilisons la fonction play() du nœud « AnimationPlayer ». Celle-ci accepte comme argument, le nom de l'animation, le temps de fondu entre l'animation précédente et celle à jouer, le temps de jeu de l'animation et si l'animation doit être jouée après la fin de l'animation précédente.

III-B-1. Animation du saut

Pour savoir quelle animation doit être jouée entre l'animation du saut et l'animation de chute, nous pouvons utiliser get_linear_velocity() afin de connaître la force verticale appliquée sur le joueur.

III-C. Code

Voici le code gérant les animations :

 
Sélectionnez
extends RigidBody2D

var input_states = preload("res://scripts/input_states.gd")

export var player_speed = 200
export var jumpforce = 2000
export var acceleration = 7
export var air_acceleration = 1
export var extra_gravity = 400

var PLAYERSTATE_PREV = ""
var PLAYERSTATE = ""
var PLAYERSTATE_NEXT = "ground"

var ORIENTATION_PREV = ""
var ORIENTATION = ""
var ORIENTATION_NEXT = "right"

var raycast_down = null

var current_speed = Vector2(0,0)

var rotate = null
var jumping = 0

var btn_right = input_states.new("btn_right")
var btn_left = input_states.new("btn_left")
var btn_jump = input_states.new("btn_jump")

var anim_player = null
var anim = ""
var anim_new = ""
var anim_speed = 1.0
var anim_blend = 0.2

func move(speed, acc, delta):
    current_speed.x = lerp(current_speed.x , speed, acc * delta)
    set_linear_velocity(Vector2(current_speed.x,get_linear_velocity().y))

func is_on_ground():
    if raycast_down.is_colliding():
        return true
    else:
        return false

func _ready():
    raycast_down = get_node("RayCast2D")
    raycast_down.add_exception(self)
    rotate = get_node("rotate")
    
    set_fixed_process(true)
    set_applied_force(Vector2(0,extra_gravity))
    
    
    anim_player = get_node("rotate/character_sprites/AnimationPlayer")

func rotate_behavior():
    if ORIENTATION == "right" and ORIENTATION_NEXT == "left":
        rotate.set_scale(rotate.get_scale() * Vector2(-1,1))
    elif ORIENTATION == "left" and ORIENTATION_NEXT == "right":
        rotate.set_scale(rotate.get_scale() * Vector2(-1,1))
        


func _fixed_process(delta):
    
    PLAYERSTATE_PREV = PLAYERSTATE
    PLAYERSTATE = PLAYERSTATE_NEXT
    
    ORIENTATION_PREV = ORIENTATION
    ORIENTATION = ORIENTATION_NEXT
    

    if PLAYERSTATE == "ground":
        ground_state(delta)
    elif PLAYERSTATE == "air":
        air_state(delta)
        
    if anim != anim_new:
        anim_new = anim
        anim_player.play(anim,anim_blend,anim_speed)
            
func ground_state(delta):

    if btn_left.check() == 2:
        move(-player_speed, acceleration, delta)
        ORIENTATION_NEXT = "left"
        anim = "run"
        anim_speed = 2.0
        anim_blend = 0.2
    elif btn_right.check() == 2:
        move(player_speed, acceleration, delta)
        ORIENTATION_NEXT = "right"
        anim = "run"
        anim_speed = 2.0
        anim_blend = 0.2
    else:
        move(0, acceleration, delta)
        anim = "idle"
        anim_speed = .5
        anim_blend = 0.2
    
    
    
    rotate_behavior()
    
    if is_on_ground():
        if btn_jump.check() == 1:
            set_axis_velocity(Vector2(0,-jumpforce))
            jumping = 1
    else:
        PLAYERSTATE_NEXT = "air"
    

func air_state(delta):
    

    if btn_left.check() == 2:
        move(-player_speed, air_acceleration, delta)
        ORIENTATION_NEXT = "left"
    elif btn_right.check() == 2:
        move(player_speed, air_acceleration, delta)
        ORIENTATION_NEXT = "right"
    else:
        move(0, air_acceleration, delta)
    
    if btn_jump.check() == 1 and jumping == 1:
        set_axis_velocity(Vector2(0,-jumpforce))
        jumping += 1
    
    if get_linear_velocity().y > 0:
        anim = "jump_down"
        anim_speed = 1.0
    else:
        anim = "jump_up"
        anim_speed = 1.0
        anim_blend = 0.0
    
    rotate_behavior()
    if is_on_ground():
        PLAYERSTATE_NEXT = "ground"

IV. Commenter

Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2015 Andreas Esau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.