Menu
CoddyTech

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.

challenge icon

Défi

Facile
  1. Ajoute public int edge = 7; (les cellules du plateau vont de -edge à edge) et public bool alive = true;.
  2. Dans Step(), après avoir défini direction, détermine next, la cellule dans laquelle la tête est sur le point d’entrer. Si elle est hors du plateau, appelle Die() et retourne sans bouger ; sinon, déplace la tête vers next.
  3. Écris void Die(), qui définit alive sur false.
  4. 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;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Unity : Snake 3D