Godot - Marble Madness 3D

Déplacement de la balle

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 - Marble Madness 3D - Déplacement de la balle


III. Résumé

Dans ce chapitre, nous apprenons à déplacer le joueur.

III-A. Utiliser le moteur physique

Afin d'avoir des éléments interagissant avec le moteur physique, vous devez utiliser le nœud « RigidBody ». Une fois le nœud créé, placez le nœud « PlayerMesh » comme enfant du « RigidBody ». Le « PlayerMesh » est la représentation graphique du « RigidBody ». Ensuite, vous devez ajouter un nœud « CollisionShape » afin de déterminer la forme physique de l'objet. Pour obtenir une forme de sphère, vous devez définir la propriété « Shape » à « SphereShape ».
La forme physique de l'objet est décalée de sa représentation visuelle. Replacez le « PlayerMesh » à l'origine et déplacez le nœud « RigidBody ». Comme il est le parent, cela entrainera le déplacement des deux objets : la représentation visuelle et la représentation physique.

À ce point, si vous lancez le jeu, la balle soumise à la gravité (grâce à son « RigidBody ») traverse le sol.

En effet, le sol n'existe pas physiquement. Sachant que le sol ne bouge jamais, nous pouvons utiliser un nœud « StaticBody ». Assignez le « GroundMesh » comme enfant du nouveau nœud. Comme pour la balle, ajoutez un « CollisionShape » pour donner une représentation physique à votre sol.

III-B. Déplacer le joueur

Pour déplacer la balle, il faut lui appliquer des forces. Ces forces dépendent des touches sur lesquelles appuie le joueur. Pour intégrer le lien entre les touches du clavier et son effet dans le jeu, nous utilisons un script que l'on attache au joueur.

III-B-1. Script player_control.gd

Nous souhaitons que le script vérifie à chaque image, les touches appuyées par le joueur. Suivant celles-ci, nous souhaitons appliquer la force adéquate pour déplacer la balle.

Comme le déplacement de la balle est effectué par l'application de forces sur celle-ci, nous utilisons la fonction _fixed_process(), que nous devons activer au début du script avec set_fixed_process().

Pour récupérer l'appui par le joueur sur les touches de déplacement, nous utilisons la fonction Input.is_action_pressed().

Pour appliquer une force à un « RigidBody », nous utilisons la fonction RigidBody.apply_impulse().

Le script hérite de la classe « RigidBody », représentant la balle.

Voici le script pour déplacer la balle :

 
Sélectionnez
extends RigidBody

# Affiche la variable dans l'interface de l'éditeur
# afin que les game designers puissent changer la valeur
# sans aller dans le code source
export var speed = 1.0

# Une position par défaut  appliquer les forces
var position = Vector3(0, 0, 0)

# Fonction appelée au démarrage du script
func _ready():
    # Active l'appel à la méthode de mise à jour de la physique
    set_fixed_process(true)

func _fixed_process(delta):
    # Récupère la direction  le joueur souhaite aller
    var x = get_axis("horizontal") # gauche/droite
    var z = get_axis("vertical")   # avant/arrière
    # Construit un vecteur unitaire basé sur l'entrée du joueur
    var direction = Vector3(x, 0, z).normalized()
    # Change la magnitude de la force à appliquer pour cette frame
    var magnitude =  speed * delta
    # Applique la force sur le rigid body.
    add_force(magnitude * direction)

func get_axis(axis):
    # Mouvement gauche/droite
    if axis == "horizontal":
        # Lorsque la touche 'left-arrow' est appuyée,
        # retourne une valeur négative.
        if Input.is_action_pressed("ui_left"):
           return -1.0
        # Lorsque la touche 'right-arrow' est appuyée,
        # retourne une valeur positive.
        elif Input.is_action_pressed("ui_right"):
           return 1.0
    # Mouvement avant/arrière
    elif axis == "vertical":
        # Lorsque la touche 'up-arrow' est appuyée,
        # retourne une valeur négative.
        if Input.is_action_pressed("ui_up"):
           return -1.0
        # Lorsque la touche 'down-arrow' est appuyée,
        # retourne une valeur positive.
        elif Input.is_action_pressed("ui_down"):
           return 1.0
    return 0.0

func add_force(force):
    # Active la physique du joueur, si celle-ci est inactive.
    # Ensuite une force est appelée sur chacun des axes X, Y et Z. 
    var x = force[0] 
    var y = force[1]
    var z = force[2]
    if (x or y or z) and is_sleeping():
        set_sleeping(false) # Réveil !
    # Applique la force donnée  la position par défaut)
    apply_impulse(position, force)

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+   

En complément sur Developpez.com

  

Copyright © 2015 Kwesi Davis. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.