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édente | ||
| dindomoteur_creation_du_joueur [2022/03/20 17:34] – Simon Deplat | dindomoteur_creation_du_joueur [2026/02/25 23:55] (Version actuelle) – [Notes de fin] Labomedia | ||
|---|---|---|---|
| Ligne 55: | Ligne 55: | ||
| ====Note à propos de la classe Joueur==== | ====Note à propos de la classe Joueur==== | ||
| - | Dans les versions précédentes de //Godot//, l' | + | Dans les versions précédentes de //Godot//, l' |
| - | Nous allons mettre | + | Les scripts |
| + | |||
| + | Notamment, dans le script | ||
| + | |||
| + | **De fait nous n' | ||
| ====Implémentation de la gravité==== | ====Implémentation de la gravité==== | ||
| - | Chaque personnage | + | **[ NOTE ] : Comme discuté [[https:// |
| + | |||
| + | Le joueur | ||
| - | // | ||
| < | < | ||
| - | class_name Personnage | ||
| extends KinematicBody2D | extends KinematicBody2D | ||
| - | var masse = 1 | + | var _gravite |
| - | var gravite | + | |
| + | var _masse | ||
| var _velocite = Vector2.ZERO | var _velocite = Vector2.ZERO | ||
| - | |||
| - | # la fonction _physics_process héritée est appelée | ||
| - | # après la fonction _physics_process parente | ||
| - | func _physics_process( delta ): | ||
| - | _velocite.y += gravite * masse * delta | ||
| - | </ | ||
| - | |||
| - | // | ||
| - | < | ||
| - | class_name Joueur | ||
| - | extends Personnage | ||
| func _ready(): | func _ready(): | ||
| - | masse = 50 | + | if get_tree().root.has_node(" |
| + | _gravite | ||
| func _physics_process( _delta ): | func _physics_process( _delta ): | ||
| + | |||
| + | # Intégration de la gravité | ||
| + | _velocite.y += _gravite * _masse | ||
| _velocite = move_and_slide_with_snap( | _velocite = move_and_slide_with_snap( | ||
| Ligne 98: | Ligne 96: | ||
| false # Inertie infinie ? | false # Inertie infinie ? | ||
| ) | ) | ||
| - | |||
| </ | </ | ||
| ====Implémentation du saut==== | ====Implémentation du saut==== | ||
| - | On ajoute au Personnage | + | On ajoute au Joueur |
| // | // | ||
| < | < | ||
| - | class_name Personnage | ||
| extends KinematicBody2D | extends KinematicBody2D | ||
| - | var masse = 1 | + | var _gravite |
| - | var gravite = Global.gravite | + | |
| - | var forceSaut = 1 | + | |
| - | var forceSautActuelle | + | var _masse |
| + | var _forceSaut = 1000 | ||
| var _velocite = Vector2.ZERO | var _velocite = Vector2.ZERO | ||
| - | |||
| - | # la fonction _physics_process héritée est appelée | ||
| - | # après la fonction _physics_process parente | ||
| - | func _physics_process( delta ): | ||
| - | _velocite.y += gravite * masse * delta | ||
| - | |||
| - | #Si le Joueur est au sol, et s'il est en train de sauter, | ||
| - | if is_on_floor() and forceSautActuelle > 0: | ||
| - | # Remise à zéro de sa vélocité de saut | ||
| - | forceSautActuelle = 0 | ||
| - | # Si le joueur n'est pas sur le sol mais saute | ||
| - | if not is_on_floor() and forceSautActuelle > 0: | ||
| - | # Décroît de la vélocité de saut | ||
| - | forceSautActuelle = forceSautActuelle - ( gravite * masse * delta ) | ||
| - | # Remise à zéro si la vélocité de saut devient négative | ||
| - | if forceSautActuelle < 0: | ||
| - | forceSautActuelle = 0 | ||
| - | |||
| - | </ | ||
| - | |||
| - | // | ||
| - | < | ||
| - | class_name Joueur | ||
| - | extends Personnage | ||
| func _ready(): | func _ready(): | ||
| - | masse = 100 | + | if get_tree().root.has_node(" |
| - | forceSaut | + | _gravite |
| func _physics_process( _delta ): | func _physics_process( _delta ): | ||
| - | # Mécanisme de saut | + | entreeSaut() |
| - | if is_on_floor(): | + | |
| - | if Input.is_action_just_pressed(" | + | |
| - | forceSautActuelle = forceSaut | + | |
| - | # Si le personnage a encore une vélocité de saut | + | # Intégration |
| - | if forceSautActuelle > 0: | + | _velocite.y |
| - | # Compensation | + | |
| - | _velocite.y | + | |
| _velocite = move_and_slide_with_snap( | _velocite = move_and_slide_with_snap( | ||
| Ligne 168: | Ligne 134: | ||
| ) | ) | ||
| + | # 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==== | ====Ajout du déplacement latéral==== | ||
| - | Un simple algorithme qui permet de **déplacer le personnage | + | Un simple algorithme qui permet de **déplacer le Joueur |
| Pas de phénomène d' | Pas de phénomène d' | ||
| - | // | ||
| < | < | ||
| - | class_name Personnage | ||
| extends KinematicBody2D | extends KinematicBody2D | ||
| - | var masse = 1 | + | var _gravite |
| - | var gravite = Global.gravite | + | |
| - | var forceSaut = 1 | + | |
| - | var vitesse = 1 | + | |
| - | var forceSautActuelle | + | var _masse = 1 |
| + | var _forceSaut = 1000 | ||
| + | var _vitesse = 300 | ||
| + | |||
| + | var _direction | ||
| var _velocite = Vector2.ZERO | var _velocite = Vector2.ZERO | ||
| - | # la fonction _physics_process héritée est appelée | + | func _ready(): |
| - | # après la fonction _physics_process parente | + | if get_tree().root.has_node(" |
| - | func _physics_process( delta ): | + | _gravite |
| - | _velocite.y += gravite | + | |
| + | func _physics_process( _delta ): | ||
| - | #Si le Joueur est au sol, et s'il est en train de sauter, | + | bouge() |
| - | if is_on_floor() and forceSautActuelle > 0: | + | entreeSaut() |
| - | # Remise à zéro de sa vélocité de saut | + | |
| - | forceSautActuelle = 0 | + | # Intégration du déplacement latéral |
| - | # Si le joueur n' | + | _velocite.x = _direction * _vitesse |
| - | if not is_on_floor() and forceSautActuelle > 0: | + | # Intégration |
| - | # Décroît | + | _velocite.y += _gravite * _masse |
| - | forceSautActuelle = forceSautActuelle - ( gravite * masse * delta ) | + | |
| - | # Remise à zéro si la vélocité de saut devient négative | + | _velocite = move_and_slide_with_snap( |
| - | if forceSautActuelle < 0: | + | _velocite, |
| - | forceSautActuelle = 0 | + | Vector2.ZERO, |
| + | Vector2.UP, # Direction du sol ( Vector2.UP ) | ||
| + | true, | ||
| + | 4, # Nombre | ||
| + | 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(): |
| - | class_name Personnage | + | if Input.is_action_just_pressed(" |
| - | extends KinematicBody2D | + | _direction |
| - | + | elif Input.is_action_just_pressed(" | |
| - | var masse = 1 | + | _direction |
| - | var gravite = Global.gravite | + | |
| - | var forceSaut | + | |
| - | var vitesse = 1 | + | |
| - | + | ||
| - | var forceSautActuelle = 0 | + | |
| - | + | ||
| - | var _velocite = Vector2.ZERO | + | |
| - | + | ||
| - | # la fonction _physics_process héritée est appelée | + | |
| - | # après la fonction _physics_process parente | + | |
| - | func _physics_process( delta ): | + | |
| - | _velocite.y += gravite * masse * delta | + | |
| - | #Si le Joueur est au sol, et s'il est en train de sauter, | + | if Input.is_action_just_released(" |
| - | if is_on_floor() and forceSautActuelle > 0: | + | if not Input.is_action_pressed(" |
| - | # Remise à zéro de sa vélocité de saut | + | _direction = 0 |
| - | forceSautActuelle = 0 | + | else: |
| - | # Si le joueur n'est pas sur le sol mais saute | + | _direction |
| - | if not is_on_floor() and forceSautActuelle > 0: | + | |
| - | # Décroît de la vélocité de saut | + | if Input.is_action_just_released(" |
| - | forceSautActuelle | + | if not Input.is_action_pressed(" |
| - | # Remise à zéro si la vélocité de saut devient négative | + | _direction |
| - | if forceSautActuelle < 0: | + | else: |
| - | forceSautActuelle | + | _direction = -1 |
| </ | </ | ||
| Ligne 245: | Ligne 215: | ||
| Il y a maintenant nécessité pour le //Joueur// de **se mettre en mouvement et d' | Il y a maintenant nécessité pour le //Joueur// de **se mettre en mouvement et d' | ||
| - | // | ||
| < | < | ||
| - | class_name Personnage | ||
| extends KinematicBody2D | extends KinematicBody2D | ||
| - | var masse = 1 | + | var _gravite |
| - | var gravite = Global.gravite | + | |
| - | var forceSaut = 1 | + | |
| - | var vitesse = 1 | + | |
| - | var acceleration | + | var _masse |
| - | var deceleration | + | var _forceSaut = 350 |
| + | var _vitesse = 300 | ||
| + | var _acceleration | ||
| + | var _deceleration = 10 | ||
| - | var forceSautActuelle | + | var _direction |
| - | var vitesseActuelle | + | var _vitesseActuelle |
| var _velocite = Vector2.ZERO | var _velocite = Vector2.ZERO | ||
| - | |||
| - | # la fonction _physics_process héritée est appelée | ||
| - | # après la fonction _physics_process parente | ||
| - | func _physics_process( delta ): | ||
| - | _velocite.y += gravite * masse * delta | ||
| - | |||
| - | #Si le Joueur est au sol, et s'il est en train de sauter, | ||
| - | if is_on_floor() and forceSautActuelle > 0: | ||
| - | # Remise à zéro de sa vélocité de saut | ||
| - | forceSautActuelle = 0 | ||
| - | # Si le joueur n'est pas sur le sol mais saute | ||
| - | if not is_on_floor() and forceSautActuelle > 0: | ||
| - | # Décroît de la vélocité de saut | ||
| - | forceSautActuelle = forceSautActuelle - ( gravite * masse * delta ) | ||
| - | # Remise à zéro si la vélocité de saut devient négative | ||
| - | if forceSautActuelle < 0: | ||
| - | forceSautActuelle = 0 | ||
| - | |||
| - | </ | ||
| - | |||
| - | Joueur.gd | ||
| - | < | ||
| - | class_name Joueur | ||
| - | extends Personnage | ||
| - | |||
| - | var _direction = 0 | ||
| func _ready(): | func _ready(): | ||
| - | masse = 100 | + | if get_tree().root.has_node(" |
| - | forceSaut = 14000 | + | _gravite |
| - | vitesse | + | |
| func _physics_process( _delta ): | func _physics_process( _delta ): | ||
| - | # Vérification des entrées utilisateurs pour l'axe horizontal | ||
| bouge() | bouge() | ||
| + | entreeSaut() | ||
| + | traitementDuMouvement() | ||
| - | # Vélocité horizontale | + | # 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: | if _direction != 0: | ||
| - | vitesseActuelle | + | _vitesseActuelle |
| # Restriction aux vitesses max | # Restriction aux vitesses max | ||
| - | if vitesseActuelle | + | if _vitesseActuelle |
| - | if vitesseActuelle | + | if _vitesseActuelle |
| - | vitesseActuelle | + | _vitesseActuelle |
| else: | else: | ||
| - | if vitesseActuelle | + | if _vitesseActuelle |
| - | vitesseActuelle | + | _vitesseActuelle |
| else: | else: | ||
| # Décélération au sol | # Décélération au sol | ||
| if is_on_floor(): | if is_on_floor(): | ||
| - | if vitesseActuelle | + | if _vitesseActuelle |
| - | if | + | if |
| - | vitesseActuelle | + | _vitesseActuelle |
| else: | else: | ||
| - | vitesseActuelle | + | _vitesseActuelle |
| - | elif | + | elif |
| - | if | + | if |
| - | vitesseActuelle | + | _vitesseActuelle |
| else: | else: | ||
| - | vitesseActuelle | + | _vitesseActuelle |
| + | </ | ||
| + | |||
| + | ====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 ): | ||
| - | _velocite.x = vitesseActuelle | + | bouge() |
| + | entreeSaut() | ||
| + | if _saute: | ||
| + | if _velocite.y < 0: | ||
| + | interruptionDuSaut() | ||
| + | traitementDuMouvement() | ||
| - | # Mécanisme de saut | + | # Intégration du déplacement latéral |
| - | if is_on_floor(): | + | _velocite.x = _vitesseActuelle |
| - | if Input.is_action_just_pressed(" | + | # Intégration |
| - | forceSautActuelle | + | if _velocite.y < 0: |
| - | + | _velocite.y += _gravite * _masse * _ratioDGraviteSaut | |
| - | # Si le personnage a encore une vélocité | + | else: |
| - | if forceSautActuelle > 0: | + | _velocite.y |
| - | # Compensation de la gravité | + | |
| - | _velocite.y | + | |
| _velocite = move_and_slide_with_snap( | _velocite = move_and_slide_with_snap( | ||
| Ligne 346: | Ligne 368: | ||
| ) | ) | ||
| + | # 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(): | func bouge(): | ||
| if Input.is_action_just_pressed(" | if Input.is_action_just_pressed(" | ||
| Ligne 364: | Ligne 401: | ||
| _direction = -1 | _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' | ||
| + | Il pourra servir de base pour des jeux n' | ||
| - | **[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.1647797688.txt.gz · Dernière modification : de Simon Deplat
