Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Système de Collision

Comment ça fonctionne

  • Chaque objet possède un AABB (boîte englobante alignée sur les axes) basé sur la taille de son sprite
  • Les sprites peuvent avoir des limites de collision personnalisées (définies dans l'Éditeur de Sprites)
  • La collision est vérifiée à chaque frame pour les objets dynamiques

Types de Collision Expliqués

  1. Aucun - L'objet est complètement ignoré par le système de collision
  2. Statique - Agit comme un mur immovable (utiliser pour le terrain, les plateformes)
  3. Dynamique - Se déplace et est repoussé hors d'autres colliders (utiliser pour le joueur, les ennemis)
  4. Déclencheur - Détecte le chevauchement mais ne bloque pas le mouvement (utiliser pour les objets à collecter, les zones)

Résolution de Collision

  • Les objets dynamiques sont automatiquement repoussés hors des objets Statique et d'autres objets Dynamiques
  • Les déclencheurs ne bloquent jamais le mouvement - ils détectent seulement les chevauchements

Le Callback onCollision

La fonction onCollision(objA, objB) est appelée lorsque des objets se chevauchent. Les modèles de rappel sont :

Type de objA Type de objB Callback généré ? Remarques
Dynamique Statique Oui Dynamique repoussé hors de statique
Dynamique Dynamique Oui (dans les deux sens) Les deux objets reçoivent des callbacks
Dynamique Déclencheur Oui Déclencheur détecté
Déclencheur Déclencheur Oui Les deux déclencheurs se détectent
Statique Statique Non Les statiques ne génèrent pas de callbacks
Statique Déclencheur Non Aucun ne génère de callbacks

Règles clés :

  • objA est toujours soit dynamique soit déclencheur
  • Lorsqu'il y a collision entre deux objets dynamiques, les deux reçoivent un callback (chacun en tant que objA)
  • Lorsque deux déclencheurs se chevauchent, un callback est généré (premier déclencheur en tant que objA)
  • Les objets statiques n'apparaissent jamais comme objA

Exemple : Détecter Différents Types de Collision

func onCollision(objA, objB) {
    var typeA = getCollisionType(objA)
    var typeB = getCollisionType(objB)

    // Joueur (dynamique) touchant une pièce (déclencheur)
    if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
        print("Collecté !")
        removeObject(gameScene, objB)
    }

    // Deux déclencheurs se chevauchant (ex : zones de détection)
    if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
        print(getName(objA) + " est entré dans la zone de " + getName(objB))
    }

    // Joueur touché par un ennemi (les deux dynamiques)
    if (getName(objA) == "player" && getName(objB) == "enemy") {
        print("Joueur touché !")
    }
}

Système de Physique

Tiniest Engine a un système de physique intégré qui gère la gravité et la vélocité automatiquement pour les objets dynamiques.

Comment fonctionne la physique

Chaque frame, le moteur applique automatiquement :

  1. La gravité de la scène à la vélocité de chaque objet dynamique
  2. La vélocité à la position de chaque objet dynamique
// Pipeline de physique (géré automatiquement par le moteur) :
velocity += gravity * dt
position += velocity * dt

Configuration de la Gravité

Définissez la gravité sur une scène pour faire tomber les objets dynamiques :

func start() {
    // Définir la gravité vers le bas (300 pixels par seconde carrée)
    setGravityY(gameScene, 300)

    // Optionnel : gravité horizontale (effet de vent)
    setGravityX(gameScene, 0)

    setScene(gameScene)
}

Utilisation de la Vélocité

Contrôlez les objets en utilisant la vélocité au lieu de définir directement la position :

var player = Object("player")
var jumpForce = -200 // Négatif = vers le haut

func start() {
    setCollisionType(player, COLLISION_DYNAMIC())
    addObject(gameScene, player)
    setGravityY(gameScene, 300)
    setScene(gameScene)
}

func onUpdate(dt) {
    // Mouvement horizontal via vélocité
    if (isKeyHeld(KEY_LEFT())) {
        setVelocityX(player, -100)
    } else if (isKeyHeld(KEY_RIGHT())) {
        setVelocityX(player, 100)
    } else {
        setVelocityX(player, 0)
    }

    // Saut en définissant la vélocité vers le haut
    if (isKeyPressed(KEY_SPACE())) {
        setVelocityY(player, jumpForce)
    }
}

Fonctions de Physique

Fonction Description
getVelocityX(obj) Renvoie la vélocité X de l'objet
setVelocityX(obj, vx) Définit la vélocité X de l'objet
getVelocityY(obj) Renvoie la vélocité Y de l'objet
setVelocityY(obj, vy) Définit la vélocité Y de l'objet
getGravityX(scene) Renvoie le composant de gravité X de la scène
setGravityX(scene, gx) Définit le composant de gravité X de la scène
getGravityY(scene) Renvoie le composant de gravité Y de la scène
setGravityY(scene, gy) Définit la gravité Y de la scène (positif = bas)

Important : Seuls les objets COLLISION_DYNAMIC() sont affectés par la gravité et ont leur vélocité appliquée automatiquement