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

  1. Keine - Objekt wird vollständig vom Kollisionssystem ignoriert
  2. Statisch - Wirkt wie eine unbewegliche Wand (verwendet für Terrain, Plattformen)
  3. Dynamisch - Bewegt sich und wird aus anderen Collidern gedrängt (verwendet für Spieler, Feinde)
  4. 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:

  • objA ist 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:

  1. Die Szenen-Schwerkraft auf die Geschwindigkeit jedes dynamischen Objekts an
  2. 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.