Aller au contenu principal

Contrôle de flux

Chaque comportement dynamique dans un jeu est une décision : si le joueur monte en voiture, changer la radio. Si sa santé passe sous vingt pour cent, déclencher la panique. Si le point d'arrivée est atteint, valider la mission. Le contrôle de flux traduit ces règles en C#.

Les clauses de garde : éviter la pyramide de l'enfer

Les débutants empilent souvent les if les uns dans les autres jusqu'à ce que le code sorte de l'écran vers la droite :

// Fragile et difficile à relire
private void OnTick(object sender, EventArgs e)
{
if (Game.Player.Character != null)
{
if (Game.Player.Character.Exists())
{
if (Game.Player.Character.IsAlive)
{
if (Game.Player.Character.IsInVehicle())
{
// L'action est enfouie sous quatre niveaux d'indentation
}
}
}
}
}

La bonne pratique professionnelle est la clause de garde (sortie anticipée). Tu inverses la condition et tu sors immédiatement (return) si le prérequis n'est pas rempli :

// Propre, plat et défensif
private void OnTick(object sender, EventArgs e)
{
Ped player = Game.Player.Character;
if (player == null || !player.Exists() || !player.IsAlive)
{
return;
}

if (!player.IsInVehicle())
{
return;
}

// Le cœur du traitement reste collé à la marge de gauche
Vehicle car = player.CurrentVehicle;
}

Les boucles : répéter une action

Quand tu as besoin de répéter une tâche, le C# propose plusieurs structures de boucle :

La boucle foreach

Le moyen le plus lisible d'examiner une série d'éléments :

foreach (Ped ped in World.GetAllPeds())
{
if (ped.IsDead)
{
// Traiter un ped au sol
}
}

La boucle for

Utile quand tu as besoin d'un compteur numérique précis :

for (int i = 0; i < 5; i++)
{
// Répéter une action exactement 5 fois
}

La règle d'or du scripting de jeu : ne jamais bloquer l'image

Dans un logiciel de bureau classique, on pourrait écrire while (!fichierTelecharge) { Thread.Sleep(100); }. Dans un script de jeu, cela tue instantanément le processus.

Rappelle-toi la chaîne vue à la leçon 14 : ton script s'exécute sur une fibre qui partage son temps avec la boucle principale du moteur. Si tu écris un while (true) sans relâcher la main, l'exécution ne revient jamais au moteur. Le jeu ne peut plus dessiner l'image suivante, la physique s'arrête, et Windows déclare GTA5.exe comme bloqué.

Si une action doit se dérouler dans le temps, ne boucle pas au sein d'une seule image. Laisse plutôt OnTick avancer d'un petit pas à chaque image, mesure le temps écoulé avec Game.GameTime, et laisse respirer le moteur.

Dans la leçon suivante, nous verrons comment découper ces instructions en fonctions réutilisables ayant chacune un rôle clair.