Aujourd’hui nous allons apprendre à déplacer facilement un cube.
Pour cela je vais créer une nouvelle scène Node3D avec un MeshInstance3D. Le Mesh sera un Cube. Je vais créer un script C# sur node3d.
Dans un premiers temps, nous allons nous concentrer sur la class Input. Input permet de gérer les entrées clavier, souris, manette, etc.
1. Input
Il y a 3 méthodes qui proviennent de la class Input que nous devons apprendre :
- Input.IsActionJustPressed(...); : Si une action vient juste d’être appuyée
- Input.IsActionPressed(...); : Si une action est maintenue
- Input.IsActionJustReleased(...); : Si une action est relâchée
Chaque méthode prend un argument qui est la touche que nous devons appuyer. Pour connaître ou définir les actions possibles, nous devons aller dans l’onglet Projet/Paramètre du projet/Contrôles.
On remarque qu’il y a déjà plusieurs actions qui sont déjà configurées comme “ui_left”, “ui_right”, “ui_up”, “ui_back”. Les actions que je viens de vous énumérer font référence aux flèches du clavier.
Pour les utiliser il suffit de mettre en commun ce que je vous ai appris : Input.IsActionJustPressed(“ui_left”);
Pour savoir si nous avons bien appuyé sur la touche, nous pouvons nous servir de la condition if.
if(Input.IsActionJustPressed("ui_left"))
{
GD.Print("Gauche");
}
2. Translate et Vector3
Maintenant, voyons réellement comment déplacer nôtre cube. Si nous regardons la documentation de Node3D, on remarque que nous pouvons faire pivoter le noeud avec rotation ou encore le déplacer avec translate. Il est possible de faire beaucoup plus de choses. Je vous laisse voir par vous même la documentation officielle.
Nous allons nous servir de la méthode translate. Translate prend comme argument une variable de type Vector3. Une variable de type Vector3 a besoin de 3 paramètres qui sont les coordonnées X, Y et Z.
Pour ceux qui ne savent pas ce qu’est un vecteur, pour faire vraiment simple : un vecteur est une force, plus simplement une direction donnée.
La coordonnée X est sur l’axe des abscisses, Y pour l’axe des ordonnées et Z pour la profondeur.
Pour appliquer un Vector3, nous devons déjà savoir dans quelle direction nous voulons que nôtre objet se déplace. Si nous voulons que nôtre objet aille à droite, nous devons seulement modifier la variable de la coordonnée X.
Pour faire simple nous allons déplacer notre cube de 1 mètre en 1 mètre. Pour ce faire je vais appliquer ce que nous avons vu :
if( Input.IsActionJustPressed("ui_right") )
{
Translate(Vector3(1,0,0));
}
Pour déplacer le Cube vers la gauche, nous devons utiliser la valeur négative de la coordonnée X.
Donc :
if( Input.IsActionJustPressed("ui_left") )
{
Translate(Vector3(-1,0,0));
}
Vector3 possède plusieurs constantes déjà définies. Voici une petite liste :
- LEFT = Vector3(-1, 0, 0)
- RIGHT = Vector3(1, 0, 0)
- UP = Vector3(0, 1, 0)
- DOWN = Vector3(0, -1, 0)
- FORWARD = Vector3(0, 0, -1)
- BACK = Vector3(0, 0, 1)
ATTENTION ! Pour faire avancer de l’avant le cube nous devons nous déplacer sur l’axe Z et non pas sur l’axe Y. L’axe Y est pour la hauteur et l’axe Z est pour la profondeur.
Voilà le code avec les constantes :
public override void _Process(double delta)
{
if(Input.IsActionJustPressed("ui_left"))
{
Translate(Vector3.Left);
}
if(Input.IsActionJustPressed("ui_right"))
{
Translate(Vector3.Right);
}
if(Input.IsActionJustPressed("ui_up"))
{
Translate(Vector3.Forward);
}
if(Input.IsActionJustPressed("ui_down"))
{
Translate(Vector3.Back);
}
}
Ce n’est pas encore ce que je veux. Je souhaite avoir un mouvement fluide de déplacement et non pas un déplacement saccadé. Pour cela, nous allons nous servir du delta disponible dans la fonction _Process.
3. Delta
Le delta est le temps écoulé entre deux images affichées. Si on dit que nôtre jeu tourne à 60 fps (images par seconde), le delta équivaut à 1/60e de seconde. C’est le delta qui va nous permettre de synchroniser nos différentes animations selon l’ordinateur utilisé.
Pour l’appliquer, nous devons le multiplier au Vector3. Vector3 n’accepte pas de se multiplier à une variable de type double. Nous allons la caster en Float.
Translate(Vector3.Left * (float)delta);
Maintenant le déplacement est fluide mais la vitesse de déplacement est très faible. Pour régler ce problème, nous devons juste créer une variable vitesse et la multiplier à delta et vector3.
float vitesse = 5f;
public override void _Process(double delta)
{
if(Input.IsActionPressed("ui_left"))
{
Translate(Vector3.Left * (float)delta * vitesse);
}
if(Input.IsActionPressed("ui_right"))
{
Translate(Vector3.Right * (float)delta * vitesse);
}
if(Input.IsActionPressed("ui_up"))
{
Translate(Vector3.Forward * (float)delta * vitesse);
}
if(Input.IsActionPressed("ui_down"))
{
Translate(Vector3.Back * (float)delta * vitesse);
}
}
Et voilà nous avons nôtre script de déplacement simpliste en C#.