dindomoteur_creation_du_joueur
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteDernière révisionLes deux révisions suivantes | ||
dindomoteur_creation_du_joueur [2022/03/20 11:57] – Simon Deplat | dindomoteur_creation_du_joueur [2022/03/27 14:25] – Simon Deplat | ||
---|---|---|---|
Ligne 28: | Ligne 28: | ||
De manière intuitive, chacun d' | De manière intuitive, chacun d' | ||
+ | |||
+ | **Les calques et masques de collisions seront également réglés correctement** (le Joueur est sur le calque 1 et détecte le masque 4 (entre autres), et la plate-forme est sur le calque 4 et ne détecte rien). | ||
Ensuite, **je les ajoute au nœud Main en les instanciant**. Ils ne bougent pas, mais ils apparaissent à l' | Ensuite, **je les ajoute au nœud Main en les instanciant**. Ils ne bougent pas, mais ils apparaissent à l' | ||
Ligne 34: | Ligne 36: | ||
- | ====Mise-en-place du système | + | ====Notes à propos de la méthode |
Après quelques recherches, nous sommes arrivés à plusieurs conclusions concernant le système de collisions liées au //Joueur//. | Après quelques recherches, nous sommes arrivés à plusieurs conclusions concernant le système de collisions liées au //Joueur//. | ||
**C' | **C' | ||
+ | |||
+ | Si vous n' | ||
Voici [[https:// | Voici [[https:// | ||
- | Nous avions dans un premier temps commencé à utiliser **la méthode // | + | Nous allons |
+ | |||
+ | **La méthode // | ||
+ | |||
+ | Je pensais en premier lieu que **cela ne permettait pas d' | ||
+ | |||
+ | Le cas échéant, **c' | ||
+ | |||
+ | ====Note à propos de la classe Joueur==== | ||
+ | Dans les versions précédentes de //Godot//, l' | ||
+ | |||
+ | Les scripts en deviennent cependant moins intuitifs et cela peut conduire à des erreurs. | ||
+ | |||
+ | Notamment, dans le script // | ||
+ | |||
+ | **De fait nous n' | ||
+ | |||
+ | ====Implémentation de la gravité==== | ||
+ | |||
+ | Le joueur aura donc une masse et sera affecté par la gravité : | ||
+ | |||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 1 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | # Intégration de la gravité | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | ====Implémentation du saut==== | ||
+ | |||
+ | On ajoute au Joueur une capacité de saut. Plus les valeurs de //masse// et de // | ||
+ | |||
+ | // | ||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 1 | ||
+ | var _forceSaut = 1000 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | entreeSaut() | ||
+ | |||
+ | # Intégration de la gravité | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y -= _forceSaut | ||
+ | </ | ||
+ | |||
+ | ====Ajout du déplacement latéral==== | ||
+ | Un simple algorithme qui permet de **déplacer le Joueur sur l'axe horizontal**. Ici, le plus intéressant est la méthode // | ||
+ | |||
+ | Pas de phénomène d' | ||
+ | |||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 1 | ||
+ | var _forceSaut = 1000 | ||
+ | var _vitesse = 300 | ||
+ | |||
+ | var _direction = 0 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | bouge() | ||
+ | entreeSaut() | ||
+ | |||
+ | # Intégration du déplacement latéral | ||
+ | _velocite.x = _direction * _vitesse | ||
+ | # Intégration de la gravité | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y -= _forceSaut | ||
+ | |||
+ | # Appui sur les boutons clavier de déplacement | ||
+ | func bouge(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _direction = -1 | ||
+ | elif Input.is_action_just_pressed(" | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = -1 | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Ajout d'une inertie latérale==== | ||
+ | Il y a maintenant nécessité pour le //Joueur// de **se mettre en mouvement et d' | ||
+ | |||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 1 | ||
+ | var _forceSaut = 350 | ||
+ | var _vitesse = 300 | ||
+ | var _acceleration = 20 | ||
+ | var _deceleration = 10 | ||
+ | |||
+ | var _direction = 0 | ||
+ | var _vitesseActuelle = 0 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | bouge() | ||
+ | entreeSaut() | ||
+ | traitementDuMouvement() | ||
+ | |||
+ | # Intégration du déplacement latéral | ||
+ | _velocite.x = _vitesseActuelle | ||
+ | # Intégration de la gravité | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y = _forceSaut | ||
+ | |||
+ | # Appui sur les boutons clavier de déplacement | ||
+ | func bouge(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _direction = -1 | ||
+ | elif Input.is_action_just_pressed(" | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = -1 | ||
+ | |||
+ | # Gestion des accélérations/ | ||
+ | func traitementDuMouvement(): | ||
+ | # Vélocité horizontale | ||
+ | if _direction != 0: | ||
+ | _vitesseActuelle += _acceleration * _direction | ||
+ | |||
+ | # Restriction aux vitesses max | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_vitesse: | ||
+ | _vitesseActuelle = -_vitesse | ||
+ | else: | ||
+ | if _vitesseActuelle > _vitesse: | ||
+ | _vitesseActuelle = _vitesse | ||
+ | else: | ||
+ | # Décélération au sol | ||
+ | if is_on_floor(): | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_deceleration: | ||
+ | _vitesseActuelle += _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | elif _vitesseActuelle > 0: | ||
+ | if _vitesseActuelle > _deceleration: | ||
+ | _vitesseActuelle -= _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | </ | ||
+ | |||
+ | ====Affinage de l' | ||
+ | On ajoute deux mécanismes pour rendre les sauts plus agréables. | ||
+ | |||
+ | Premièrement, | ||
+ | |||
+ | Deuxièmement, | ||
+ | |||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 2 | ||
+ | var _forceSaut = 2000 | ||
+ | var _vitesse = 300 | ||
+ | var _acceleration = 20 | ||
+ | var _deceleration = 10 | ||
+ | var _ratioDInterruptionDuSaut = 0.5 | ||
+ | var _ratioDGraviteSaut = 0.75 | ||
+ | |||
+ | var _direction = 0 | ||
+ | var _vitesseActuelle = 0 | ||
+ | var _forceSautActuelle = 0 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | var _saute = false | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | bouge() | ||
+ | entreeSaut() | ||
+ | if _saute: | ||
+ | if _velocite.y < 0: | ||
+ | interruptionDuSaut() | ||
+ | traitementDuMouvement() | ||
+ | |||
+ | # Intégration du déplacement latéral | ||
+ | _velocite.x = _vitesseActuelle | ||
+ | # Intégration de la gravité | ||
+ | if _velocite.y < 0: | ||
+ | _velocite.y += _gravite * _masse * _ratioDGraviteSaut | ||
+ | else: | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y -= _forceSaut | ||
+ | _saute = true | ||
+ | |||
+ | # Gestion de l' | ||
+ | func interruptionDuSaut(): | ||
+ | if Input.is_action_just_released(" | ||
+ | _velocite.y *= _ratioDInterruptionDuSaut | ||
+ | _saute = false | ||
+ | |||
+ | # Appui sur les boutons clavier de déplacement | ||
+ | func bouge(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _direction = -1 | ||
+ | elif Input.is_action_just_pressed(" | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = 1 | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = -1 | ||
+ | |||
+ | # Gestion des accélérations/ | ||
+ | func traitementDuMouvement(): | ||
+ | # Vélocité horizontale | ||
+ | if _direction != 0: | ||
+ | _vitesseActuelle += _acceleration * _direction | ||
+ | |||
+ | # Restriction aux vitesses max | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_vitesse: | ||
+ | _vitesseActuelle = -_vitesse | ||
+ | else: | ||
+ | if _vitesseActuelle > _vitesse: | ||
+ | _vitesseActuelle = _vitesse | ||
+ | else: | ||
+ | # Décélération au sol | ||
+ | if is_on_floor(): | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_deceleration: | ||
+ | _vitesseActuelle += _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | elif _vitesseActuelle > 0: | ||
+ | if _vitesseActuelle > _deceleration: | ||
+ | _vitesseActuelle -= _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | </ | ||
+ | |||
+ | ====Ajout d'une Camera2D==== | ||
+ | |||
+ | **L' | ||
+ | |||
+ | À l'aide de l' | ||
+ | |||
+ | C'est suffisant pour le prototypage. | ||
+ | |||
+ | ====Changement de direction du personnage==== | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | # Appui sur les boutons clavier de déplacement | ||
+ | func bouge(): | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _direction = -1 | ||
+ | if not Input.is_action_pressed(" | ||
+ | $Sprite.set_scale( Vector2( -1, 1 ) ) | ||
+ | elif Input.is_action_just_pressed(" | ||
+ | _direction = 1 | ||
+ | if not Input.is_action_pressed(" | ||
+ | $Sprite.set_scale( Vector2( 1, 1 ) ) | ||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = 1 | ||
+ | $Sprite.set_scale( Vector2( 1, 1 ) ) | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = -1 | ||
+ | $Sprite.set_scale( Vector2( -1, 1 ) ) | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Animation du personnage==== | ||
+ | |||
+ | Il ne manque à ce stade plus que d' | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | J'ai commencé par **ajouter un nœud // | ||
+ | |||
+ | J'ai activé **la //lecture automatique au chargement// | ||
+ | |||
+ | **J'ai dû rajouter un nœud // | ||
+ | |||
+ | Ma première idée était d' | ||
+ | |||
+ | À la place, j'ai mis un // | ||
+ | |||
+ | Cependant, cela pose le problème inverse lorsque que le personnage passe une plate-forme à sens unique en sautant. Alors qu'il est sensé être en saut, le // | ||
+ | |||
+ | Le tout est ensuite appelé au sein d'une fonction dédiée : | ||
+ | |||
+ | < | ||
+ | func _physics_process( _delta ): | ||
+ | [...] | ||
+ | animer() | ||
+ | |||
+ | [...] | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if not $RayCast2D.enabled: | ||
+ | $RayCast2D.set_enabled( true ) | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y -= _forceSaut | ||
+ | _saute = true | ||
+ | $RayCast2D.set_enabled( false ) | ||
+ | |||
+ | |||
+ | [...] | ||
+ | # Animation du personnage : | ||
+ | func animer(): | ||
+ | # Vérifier si le personnage est au sol : | ||
+ | if $RayCast2D.enabled: | ||
+ | if $RayCast2D.is_colliding(): | ||
+ | # S'il bouge | ||
+ | if _velocite.x != 0: | ||
+ | $AnimationPlayer.play(" | ||
+ | # Sinon | ||
+ | else: | ||
+ | $AnimationPlayer.play(" | ||
+ | else: | ||
+ | $AnimationPlayer.play(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Contrôle du personnage à la manette==== | ||
+ | |||
+ | Avant de terminer, je souhaite simplement que l'on puisse également **contrôler le personnage à l'aide d'une manette**. | ||
+ | |||
+ | Dans cette optique, je décide de changer la fonction //bouge()// affin qu' | ||
+ | |||
+ | Je rajoute donc **un paramètre d' | ||
+ | |||
+ | < | ||
+ | extends KinematicBody2D | ||
+ | |||
+ | var _typeEntree = " | ||
+ | var _zoneMorte = 0.3 | ||
+ | |||
+ | var _gravite = 50 | ||
+ | |||
+ | var _masse = 2 | ||
+ | var _forceSaut = 2000 | ||
+ | var _vitesse = 400 | ||
+ | var _acceleration = 20 | ||
+ | var _deceleration = 10 | ||
+ | var _ratioDInterruptionDuSaut = 0.5 | ||
+ | var _ratioDGraviteSaut = 0.75 | ||
+ | |||
+ | var _direction = 0 | ||
+ | var _vitesseActuelle = 0 | ||
+ | var _forceSautActuelle = 0 | ||
+ | |||
+ | var _velocite = Vector2.ZERO | ||
+ | var _saute = false | ||
+ | |||
+ | func _ready(): | ||
+ | if get_tree().root.has_node(" | ||
+ | _typeEntree = Global.typeEntree | ||
+ | _zoneMorte = Global.zoneMorte | ||
+ | _gravite = Global.gravite | ||
+ | |||
+ | func _physics_process( _delta ): | ||
+ | |||
+ | bouge() | ||
+ | entreeSaut() | ||
+ | if _saute: | ||
+ | if _velocite.y < 0: | ||
+ | interruptionDuSaut() | ||
+ | traitementDuMouvement() | ||
+ | |||
+ | # Intégration du déplacement latéral | ||
+ | _velocite.x = _vitesseActuelle | ||
+ | # Intégration de la gravité | ||
+ | if _velocite.y < 0: | ||
+ | _velocite.y += _gravite * _masse * _ratioDGraviteSaut | ||
+ | else: | ||
+ | _velocite.y += _gravite * _masse | ||
+ | |||
+ | _velocite = move_and_slide_with_snap( | ||
+ | _velocite, | ||
+ | Vector2.ZERO, | ||
+ | Vector2.UP, | ||
+ | true, # Ne glisse pas sur le sol en cas d' | ||
+ | 4, # Nombre de collisions traitées par cycle | ||
+ | 0.9, # Angle maximum du sol ( en radians ) | ||
+ | false # Inertie infinie ? | ||
+ | ) | ||
+ | |||
+ | animer() | ||
+ | |||
+ | # Appui sur le bouton de saut | ||
+ | func entreeSaut(): | ||
+ | # Mécanisme de saut | ||
+ | if is_on_floor(): | ||
+ | if not $RayCast2D.enabled: | ||
+ | $RayCast2D.set_enabled( true ) | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _velocite.y -= _forceSaut | ||
+ | _saute = true | ||
+ | $RayCast2D.set_enabled( false ) | ||
+ | |||
+ | # Gestion de l' | ||
+ | func interruptionDuSaut(): | ||
+ | if Input.is_action_just_released(" | ||
+ | _velocite.y *= _ratioDInterruptionDuSaut | ||
+ | _saute = false | ||
+ | |||
+ | # Appui sur les boutons clavier de déplacement | ||
+ | func bouge(): | ||
+ | if _typeEntree == " | ||
+ | var entree = Input.get_axis(" | ||
+ | if entree < -_zoneMorte: | ||
+ | _direction = -1 | ||
+ | $Sprite.set_scale( Vector2( -1, 1 ) ) | ||
+ | elif entree > _zoneMorte: | ||
+ | _direction = 1 | ||
+ | $Sprite.set_scale( Vector2( 1, 1 ) ) | ||
+ | else: | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | if Input.is_action_just_pressed(" | ||
+ | _direction = -1 | ||
+ | if not Input.is_action_pressed(" | ||
+ | $Sprite.set_scale( Vector2( -1, 1 ) ) | ||
+ | elif Input.is_action_just_pressed(" | ||
+ | _direction = 1 | ||
+ | if not Input.is_action_pressed(" | ||
+ | $Sprite.set_scale( Vector2( 1, 1 ) ) | ||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = 1 | ||
+ | $Sprite.set_scale( Vector2( 1, 1 ) ) | ||
+ | |||
+ | if Input.is_action_just_released(" | ||
+ | if not Input.is_action_pressed(" | ||
+ | _direction = 0 | ||
+ | else: | ||
+ | _direction = -1 | ||
+ | $Sprite.set_scale( Vector2( -1, 1 ) ) | ||
+ | |||
+ | # Gestion des accélérations/ | ||
+ | func traitementDuMouvement(): | ||
+ | # Vélocité horizontale | ||
+ | if _direction != 0: | ||
+ | _vitesseActuelle += _acceleration * _direction | ||
+ | |||
+ | # Restriction aux vitesses max | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_vitesse: | ||
+ | _vitesseActuelle = -_vitesse | ||
+ | else: | ||
+ | if _vitesseActuelle > _vitesse: | ||
+ | _vitesseActuelle = _vitesse | ||
+ | else: | ||
+ | # Décélération au sol | ||
+ | if is_on_floor(): | ||
+ | if _vitesseActuelle < 0: | ||
+ | if _vitesseActuelle < -_deceleration: | ||
+ | _vitesseActuelle += _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | elif _vitesseActuelle > 0: | ||
+ | if _vitesseActuelle > _deceleration: | ||
+ | _vitesseActuelle -= _deceleration | ||
+ | else: | ||
+ | _vitesseActuelle = 0 | ||
+ | |||
+ | # Animation du personnage : | ||
+ | func animer(): | ||
+ | # Vérifier si le personnage est au sol : | ||
+ | if $RayCast2D.enabled: | ||
+ | if $RayCast2D.is_colliding(): | ||
+ | # S'il bouge | ||
+ | if _velocite.x != 0: | ||
+ | $AnimationPlayer.play(" | ||
+ | # Sinon | ||
+ | else: | ||
+ | $AnimationPlayer.play(" | ||
+ | else: | ||
+ | $AnimationPlayer.play(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====Notes de fin==== | ||
+ | |||
+ | Et voilà pour cette première étape de personnage. Je décide de m' | ||
- | La méthode // | + | Il pourra servir |
- | Cependant, cela ne permet pas d'implémenter certaines fonctionnalités traditionnelles des metroidvania récents, comme le saut mural. En effet, move_and_slide() est pensée pour ne proposer que la détection du sol, et ne fera donc par exemple pas la différence entre le plafond et le mur, ou en même entre le sol si le vecteur qui indique son orientation n'est pas défini. | + | Au cas où, voici à quoi ressemble ma scène dans l'éditeur : |
- | À la place, c'est la méthode move_and_collide() qui doit être utilisée. Lorsque cette méthode est appelée avec la vélocité du joueur en argument, celle-ci ne déplace pas le personnage automatiquement. À la place, elle renvoie le vecteur qui correspond au déplacement théorique du personnage. En analysant celui-ci, il devient alors possible de déduire l' | + | {{ :: |
- | **[EN CONSTRUCTION]** | + | Notez que je n'ai pas renommé les noeuds (sauf le parent) pour que vous les identifiiez plus facilement ici, mais qu'il est tout-de-même conseillé de les renommer lors de ses projets propres. |
+ | Je créé par ailleurs **une copie autonome de ce //Joueur// dans le dossier // | ||
{{tag> | {{tag> |
dindomoteur_creation_du_joueur.txt · Dernière modification : 2022/03/27 19:24 de Simon Deplat