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 a un colliseur rectangulaire basé sur sa taille de sprite
  • Les sprites peuvent avoir des limites de colliseur personnalisées (définies dans l'éditeur de sprite)
  • La rotation de l'objet fait tourner le colliseur autour du décalage central de l'objet
  • La collision utilise le SAT (théorème de l'axe de séparation), donc les rectangles tournés entrent en collision avec leur forme réellement tournée
  • La collision est vérifiée à chaque image 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 immuable (à utiliser pour le terrain, les plateformes)
  3. Dynamique - Se déplace et est repoussé hors d'autres collideurs (à 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 poussés hors des objets statiques et d'autres objets dynamiques
  • Les déclencheurs ne bloquent jamais le mouvement - ils détectent seulement les chevauchements
  • Les collideurs tournés sont résolus selon la direction de chevauchement la plus petite

Le callback onCollision

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

Type objA Type objB Callback généré ? Remarques
Dynamique Statique Oui Dynamique repoussé hors du 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 mutuellement
Statique Statique Non Les statiques ne génèrent pas de callbacks
Statique Déclencheur Non Aucun ne génère des callbacks

Règles clés :

  • objA est toujours soit Dynamique soit Déclencheur
  • Lorsque deux objets dynamiques entrent en collision, les deux reçoivent un callback (chacun comme objA)
  • Lorsque deux déclencheurs se chevauchent, un callback est généré (premier déclencheur comme objA)
  • Les objets statiques n'apparaissent jamais comme objA

Exemple : Détection de 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 l'ennemi (les deux dynamiques)
    if (getName(objA) == "player" && getName(objB) == "enemy") {
        print("Joueur touché !")
    }
}

Système de physique

Tiniest Engine dispose d'un système de physique intégré qui gère automatiquement la gravité et la vitesse pour les objets dynamiques.

Comment fonctionne la physique

Chaque image, le moteur applique automatiquement :

  1. La gravité de la scène à la vitesse de chaque objet dynamique
  2. La vitesse à 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 vitesse

Contrôlez les objets en utilisant la vitesse 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 la vitesse
    if (isKeyHeld(KEY_LEFT())) {
        setVelocityX(player, -100)
    } else if (isKeyHeld(KEY_RIGHT())) {
        setVelocityX(player, 100)
    } else {
        setVelocityX(player, 0)
    }

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

Fonctions de physique

Fonction Description
getVelocityX(obj) Renvoie la vitesse X de l'objet
setVelocityX(obj, vx) Définit la vitesse X de l'objet
getVelocityY(obj) Renvoie la vitesse Y de l'objet
setVelocityY(obj, vy) Définit la vitesse 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 = vers le bas)

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