Erstelle 2D-Spiele mit Tiniest2D
Kollision und Physik
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.
Kollision System
Funktionsweise
- Jedes Objekt hat einen Rechteck-Collider, der auf seiner Sprite-Größe basiert
- Sprites können benutzerdefinierte Collider-Bereiche haben (in Sprite Editor festgelegt)
- Die Rotation des Objekts rotiert den Collider um den Mittelpunkt des Objekts
- Kollision verwendet SAT (Separating Axis Theorem), sodass rotierte Rechtecke mit ihrer tatsächlich rotierten Form kollidieren
- Kollision wird für dynamische Objekte in jedem Frame überprüft
Erklärung der Kollisionstypen
- Keine - Objekt wird vollständig vom Kollisionssystem ignoriert
- Statisch - Wirkt wie eine unbewegliche Wand (verwendet für Terrain, Plattformen)
- Dynamisch - Bewegt sich und wird aus anderen Collidern gedrängt (verwendet für Spieler, Feinde)
- Trigger - Erkennen Überlappungen, blockieren jedoch nicht die Bewegung (verwendet für Sammlerstücke, Zonen)
Kollision-Auflösung
- Dynamische Objekte werden automatisch aus statischen und anderen dynamischen Objekten gedrängt
- Trigger blockieren niemals die Bewegung - sie erkennen lediglich Überlappungen
- Rotierte Collider werden entlang der Richtung mit der kleinsten Überlappung gelöst
Der onCollision Callback
Die Funktion onCollision(objA, objB) wird aufgerufen, wenn Objekte überlappen. Die Callback-Muster sind:
| objA Typ | objB Typ | Callback generiert? | Anmerkungen |
|---|---|---|---|
| Dynamisch | Statisch | Ja | Dynamisch wird aus statisch gedrängt |
| Dynamisch | Dynamisch | Ja (beide Richtungen) | Beide Objekte erhalten Callbacks |
| Dynamisch | Trigger | Ja | Trigger erkannt |
| Trigger | Trigger | Ja | Beide Trigger erkennen sich gegenseitig |
| Statisch | Statisch | Nein | Statische Objekte generieren keine Callbacks |
| Statisch | Trigger | Nein | Keines generiert Callbacks |
Wichtige Regeln:
objAist immer entweder Dynamisch oder Trigger- Wenn zwei dynamische Objekte kollidieren, erhält jedes einen Callback (jeweils als objA)
- Wenn zwei Trigger überlappen, wird ein Callback generiert (erster Trigger als objA)
- Statische Objekte erscheinen niemals als objA
Beispiel: Unterschiedliche Kollisionstypen erkennen
func onCollision(objA, objB) {
var typeA = getCollisionType(objA)
var typeB = getCollisionType(objB)
// Spieler (dynamisch) berührt eine Münze (Trigger)
if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
print("Eingesammelt!")
removeObject(gameScene, objB)
}
// Zwei Trigger überlappen (z.B. Erkennungszonen)
if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
print(getName(objA) + " betrat " + getName(objB) + "'s Zone")
}
// Spieler wird von Feind getroffen (beide dynamisch)
if (getName(objA) == "player" && getName(objB) == "enemy") {
print("Spieler getroffen!")
}
}
Physiksystem
Die Tiniest Engine hat ein integriertes Physiksystem, das automatisch Gravitation und Geschwindigkeit für dynamische Objekte behandelt.
Funktionsweise der Physik
Jedes Frame wendet die Engine automatisch:
- Die Szenen-Schwerkraft auf die Geschwindigkeit jedes dynamischen Objekts an
- Die Geschwindigkeit auf die Position jedes dynamischen Objekts
// Physikpipeline (automatisch von der Engine verwaltet):
velocity += gravity * dt
position += velocity * dt
Einrichten der Gravitation
Setze die Gravitation in einer Szene, um dynamische Objekte fallen zu lassen:
func start() {
// Setze nach unten gerichtete Gravitation (300 Pixel pro Sekunde quadratisch)
setGravityY(gameScene, 300)
// Optional: Horizontale Gravitation (Windeffekt)
setGravityX(gameScene, 0)
setScene(gameScene)
}
Verwendung der Geschwindigkeit
Steuere Objekte mithilfe der Geschwindigkeit, anstatt die Position direkt festzulegen:
var player = Object("player")
var jumpForce = -200 // Negativ = nach oben
func start() {
setCollisionType(player, COLLISION_DYNAMIC())
addObject(gameScene, player)
setGravityY(gameScene, 300)
setScene(gameScene)
}
func onUpdate(dt) {
// Horizontale Bewegung über Geschwindigkeit
if (isKeyHeld(KEY_LEFT())) {
setVelocityX(player, -100)
} else if (isKeyHeld(KEY_RIGHT())) {
setVelocityX(player, 100)
} else {
setVelocityX(player, 0)
}
// Springen durch Setzen der nach oben gerichteten Geschwindigkeit
if (isKeyPressed(KEY_SPACE())) {
setVelocityY(player, jumpForce)
}
}
Physikfunktionen
| Funktion | Beschreibung |
|---|---|
getVelocityX(obj) |
Gibt die X-Geschwindigkeit des Objekts zurück |
setVelocityX(obj, vx) |
Setzt die X-Geschwindigkeit des Objekts |
getVelocityY(obj) |
Gibt die Y-Geschwindigkeit des Objekts zurück |
setVelocityY(obj, vy) |
Setzt die Y-Geschwindigkeit des Objekts |
getGravityX(scene) |
Gibt die Schwerkraftkomponente X der Szene zurück |
setGravityX(scene, gx) |
Setzt die Schwerkraftkomponente X der Szene |
getGravityY(scene) |
Gibt die Schwerkraftkomponente Y der Szene zurück |
setGravityY(scene, gy) |
Setzt die Schwerkraft Y der Szene (positiv = unten) |
Wichtig: Nur COLLISION_DYNAMIC() Objekte sind von der Gravitation betroffen und haben ihre Geschwindigkeit automatisch angewendet.