Créer des jeux 2D avec Tiniest2D
Collision 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 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
- Aucun - L'objet est complètement ignoré par le système de collision
- Statique - Agit comme un mur immovable (utiliser pour le terrain, les plateformes)
- Dynamique - Se déplace et est repoussé hors d'autres colliders (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 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 :
objAest 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 :
- La gravité de la scène à la vélocité de chaque objet dynamique
- 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