Les murs
Leçon 4 sur 14 du cours Jeu Unity : Snake 3D de Coddy.
Les cases du plateau vont de -7 à 7 sur x et sur z : une case se trouve donc sur le plateau lorsque x et z sont tous deux compris entre -7 et 7. Le plateau étant centré sur 0, un seul test couvre les deux côtés : Mathf.Abs(x) > 7 est vrai au-delà de l’un ou l’autre bord.
Teste la case où la tête est sur le point d’entrer, avant qu’elle ne s’y déplace. Ainsi, quand le serpent heurte un mur, il reste sur la dernière case du plateau au lieu de finir à l’intérieur de la bordure. Une tour sur un échiquier numéroté de 0 à 7 est vérifiée de la même façon :
Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
return; // hors de l’échiquier : la tour reste en place
}
transform.position = target;Heurter un mur met fin à la partie, et le serpent s’arrête définitivement. Un bool que Update() vérifie en premier permet de faire cela : un return au début ignore aussi bien les touches que le minuteur.
Défi
Facile- Ajoute
public int edge = 7;(les cellules du plateau vont de-edgeàedge) etpublic bool alive = true;. - Dans
Step(), après avoir définidirection, déterminenext, la cellule dans laquelle la tête est sur le point d’entrer. Si elle est hors du plateau, appelleDie()et retourne sans bouger ; sinon, déplace la tête versnext. - Écris
void Die(), qui définitalivesur false. - Commence
Update()par un retour si le serpent n’est pas vivant, afin qu’un serpent mort ne tourne ni ne se déplace.
Appuie sur Play, dirige le serpent vers un mur, puis appuie sur Check.
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // secondes entre deux déplacements
private float timer;
private Vector3 direction = Vector3.right; // la direction dans laquelle la tête s’est déplacée lors du dernier déplacement
private Vector3 nextDirection = Vector3.right; // le changement de direction en attente du prochain déplacement
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
transform.position += direction;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.