⚟ Rolling ball p.1

📝 Note

Pour commencer, téléchargez le projet de départ.

🎯 Contexte

Pour ce premier exercice, nous allons nous amuser avec la physique de Godot.

Le projet est un petit jeu physique dans lequel une balle roule sur des plateformes.

Il est basé sur les assets libres de droit Rolling Ball Assets de Kenney.

Aperçu du résultat final

Le projet de départ contient déjà :

📌 Important

N’hĂ©sitez pas Ă  me solliciter si vous ĂȘtes bloquĂ©s, si quelque chose n’est pas clair ou si vous avez besoin que je rĂ©explique quelque chose. Ça pourrait ĂȘtre utile Ă  tout le monde !

🔍 DĂ©couverte du projet

Avant de commencer Ă  pratiquer, prenez le temps de regarder ce qui existe :

📌 Important

Vous devriez remarquer deux problĂšmes : la balle traverse les plateformes, et elle sort de l’écran sans que rien ne la suive.

đŸ› ïž Exercices

A. Corriger les problĂšmes

1. Ajouter la collision Ă  la balle

La balle n’a pas de collision, c’est pour ça qu’elle traverse tout ce qu’elle rencontre.

Le noeud CollisionShape2D avec un CircleShape2D ajusté à la balle
📝 Note

Tant qu’un corps physique n’a pas de forme de collision, Godot affiche un triangle d’avertissement Ă  cĂŽtĂ© du noeud. Pensez Ă  les surveiller !

Pour visualiser les collisions pendant l’exĂ©cution, activez Debug > Visible Collision Shapes.

Relancez le jeu : la balle ne devrait plus traverser les plateformes.

2. Ajouter une caméra

À prĂ©sent, il faut que la vue suive la balle quand elle sort de l’écran.

Arborescence de la balle avec sa caméra
📝 Note

Comme la camĂ©ra est enfant de la balle, sa position est relative Ă  celle de la balle (c’est le principe des transformations hiĂ©rarchiques). En revanche, elle ne tourne pas avec la balle, car sa propriĂ©tĂ© Ignore Rotation est activĂ©e par dĂ©faut.

Pour aller plus loin, vous pouvez activer Position Smoothing sur la caméra pour adoucir ses mouvements.

B. Plateforme tournante

1. Création de la scÚne

CrĂ©ez une nouvelle scĂšne (prefab) pour un bloc qui tourne sur lui-mĂȘme.

📌 Important

Le noeud racine de la scĂšne sera un AnimatableBody2D (voir documentation).

AnimatableBody2D agit comme le StaticBody2D utilisĂ© pour les plateformes immobiles, mais peut ĂȘtre dĂ©placĂ© via du code ou une animation. Il affecte alors les autres corps, comme le RigidBody2D utilisĂ© pour la balle.

Ajoutez ensuite :

2. Script de rotation

À prĂ©sent, on veut faire tourner la plateforme. Pour cela, nous allons ajouter ce comportement via un script.

📝 Note

La mĂ©thode _physics_process est appelĂ©e automatiquement Ă  chaque frame physique par le moteur, et son paramĂštre delta correspond au temps Ă©coulĂ© depuis la frame prĂ©cĂ©dente (en secondes). C’est l’équivalent de FixedUpdate dans Unity.

đŸ”„ Exemple

Voici une premiĂšre version possible (loin d’ĂȘtre parfaite) :

extends AnimatableBody2D

func _physics_process(delta):
    rotation += 1.0 * delta
📌 Important

En multipliant la vitesse par delta, la plateforme tourne Ă  la mĂȘme vitesse quel que soit le nombre d’images par seconde. On dĂ©crit donc la vitesse de rotation en fonction du temps.

⚠ Attention

La propriété rotation est exprimée en radians.

3. Utilisation dans le monde

Normalement, tout est bon : vous pouvez tester la plateforme.

4. ContrĂŽler la vitesse

Pour le moment, toutes les plateformes tournent Ă  la mĂȘme vitesse, et changer cette vitesse oblige Ă  modifier le script.

Nous allons donc exposer la vitesse dans l’inspecteur, grĂące Ă  une variable marquĂ©e @export.

đŸ”„ Exemple

La syntaxe pour déclarer une variable exportée :

@export var <nom_de_la_variable>: <type_de_la_variable> = <valeur_par_défaut>

Dans notre cas, <type_de_la_variable> sera float.

📝 Note

Une valeur nĂ©gative fait tourner la plateforme dans l’autre sens.

5. Inverser le sens du visuel

L’image de la plateforme comporte des flùches qui indiquent son sens de rotation.
Mais Ă  l’heure actuelle, elle n’est pas cohĂ©rente avec le mouvement.

Pour corriger ça, il faut retourner l’image (flip) :

On veut à présent que ce paramÚtre change en fonction du sens de rotation de la plateforme :

On va donc ajouter ce comportement dans le script.

Tout d’abord, il faut que le script puisse accĂ©der au sprite.
Nous allons utiliser une variable exposĂ©e avec @export pour rĂ©fĂ©rencer le noeud directement depuis l’inspecteur.

Voici les étapes à suivre :

đŸ”„ Exemple

La syntaxe pour déclarer une référence exportée :

@export var sprite: Sprite2D
Assignation du noeud Sprite2D par glisser-dĂ©poser dans l’inspecteur

Pour tester, placez deux plateformes dans la scĂšne World et donnez une vitesse positive Ă  l’une d’elles et nĂ©gative Ă  l’autre.
Vérifiez ensuite que le visuel est bien retourné en fonction de la vitesse de rotation.

📝 Note

Pourquoi utiliser @export plutĂŽt qu’un chemin Ă©crit en dur dans le script (comme $Sprite2D) ?

Les variables exportĂ©es sont assignĂ©es avant l’appel de _ready, vous pouvez donc les utiliser dĂšs cette mĂ©thode.

⚠ Attention

Si vous oubliez d’assigner le noeud dans l’inspecteur, la variable vaut null et le jeu plantera avec une erreur au moment d’accĂ©der au sprite.

C. ContrĂŽle de la balle

Pour le moment, la balle tombe toute seule dÚs le lancement du jeu. Nous allons rendre le jeu interactif : la balle reste immobile au départ, on vise avec la souris en maintenant le clic, et on la lance en relùchant.

1. Geler la balle

Pour que la balle ne bouge pas au lancement, il faut la geler.

📝 Note

Un corps gelĂ© n’est plus affectĂ© par la physique : il ne bouge plus, quoi qu’il arrive. Nous le dĂ©gĂšlerons par code au moment du lancer.

⚠ Attention

Faites bien attention à faire ce réglage dans la scÚne ball.tscn et pas dans la scÚne world.tscn.

2. CrĂ©er l’action de visĂ©e

Plutît que de tester directement un bouton de la souris dans le code, Godot propose un systùme d’actions : un nom (par exemple aim) auquel on associe une ou plusieurs touches ou boutons.

📝 Note

Les actions rendent le code indĂ©pendant du pĂ©riphĂ©rique : si on veut plus tard viser avec une autre touche, il suffit de changer l’association ici, sans toucher au script.

DĂ©finition de l’input map

3. Construire le visuel de visée

Nous allons afficher une ligne pour visualiser l’impulsion qui sera appliquĂ©e Ă  la balle.

4. Script de visée

Ajoutez un script au noeud Aim. Il doit réaliser les choses suivantes :

📝 Note

Input.is_action_pressed renvoie true à chaque frame tant que l’action est maintenue.

Lancez le jeu : en maintenant le clic, la ligne doit relier la balle Ă  la souris.

Visée en cours

5. Lancer la balle

DerniÚre étape : quand on relùche le clic, la balle doit partir.

📌 Important

Pour obtenir le vecteur qui va d’un point A à un point B, on calcule B - A.

📝 Note

Contrairement Ă  is_action_pressed, Input.is_action_just_released ne renvoie true qu’une seule fois, Ă  la frame oĂč l’on relĂąche le bouton. C’est exactement ce qu’il nous faut pour dĂ©clencher un lancer unique.

Une impulsion est un « coup » appliquĂ© en une fois, alors qu’une force s’applique de façon continue. Pour lancer un objet, on utilise donc une impulsion.

Pour aller plus loin, essayez d’ajuster la puissance du lancer, par exemple avec une variable @export qui multiplie l’impulsion.

D. Construisez un niveau

Vous avez maintenant tous les ingrĂ©dients : des plateformes statiques, des plateformes tournantes rĂ©glables, et une balle que l’on peut lancer Ă  la souris.

À vous de les assembler pour construire votre propre niveau !

Objectif

CrĂ©ez un niveau oĂč la balle, lancĂ©e depuis un point de dĂ©part, doit rejoindre une zone d’arrivĂ©e.

Pour le moment, l’arrivĂ©e est purement visuelle. Nous verrons plus tard comment dĂ©tecter ça automatiquement.

Conseils

🎁 Pour aller plus loin