Créer des jeux 2D avec Tiniest2D
Collisions et Physique
Lesson 9 of 11 • 10 XP
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
- Aucun - L'objet est complètement ignoré par le système de collision
- Statique - Agit comme un mur immuable (à utiliser pour le terrain, les plateformes)
- Dynamique - Se déplace et est repoussé hors d'autres collideurs (à utiliser pour le joueur, les ennemis)
- 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 :
objAest 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 :
- La gravité de la scène à la vitesse de chaque objet dynamique
- 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