0Pricing
Lua Academy · Lektion

Bewegung und Kollisionen

Erstellen Sie eine spielbare Szene.

Bewegung und Kollisionen ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Position und Geschwindigkeit

Bewegung in LÖVE bedeutet, die Position eines Objekts im Laufe der Zeit zu verändern. Speichern Sie x und y und addieren Sie in love.update die mit dt skalierte Geschwindigkeit.

Wenn Sie die Geschwindigkeit als dx und dy pro Sekunde speichern, werden diagonale Bewegung und Physik übersichtlich und unabhängig von der Bildrate.

function love.update(dt)
  player.x = player.x + player.dx * dt
  player.y = player.y + player.dy * dt
end

Eingabegesteuerte Bewegung

Kombinieren Sie Polling mit Geschwindigkeit, um ein Objekt zu steuern. Lesen Sie in love.update die Richtungstasten aus und wenden Sie Geschwindigkeit mal dt an.

Da love.keyboard.isDown in jedem Frame geprüft wird, bewegt sich die Spielfigur gleichmäßig, solange die Taste gedrückt bleibt.

function love.update(dt)
  if love.keyboard.isDown('left') then player.x = player.x - player.speed*dt end
  if love.keyboard.isDown('right') then player.x = player.x + player.speed*dt end
end

Diagonale Geschwindigkeit normalisieren

Wenn zwei Richtungstasten gleichzeitig gedrückt werden, ist die diagonale Bewegung schneller, da beide Achsen die volle Geschwindigkeit beitragen. Um das zu korrigieren, normalisieren Sie den Bewegungsvektor.

Teilen Sie die Richtung durch ihre Länge, sodass ihr Betrag 1 ist, und multiplizieren Sie sie anschließend mit der Geschwindigkeit. Dadurch entspricht die Strecke in diagonaler Richtung der Strecke in gerader Richtung.

local dx, dy = ix, iy
local len = math.sqrt(dx*dx + dy*dy)
if len > 0 then
  player.x = player.x + (dx/len) * player.speed * dt
end

Innerhalb des Bildschirms bleiben

Begrenzen Sie die Position, damit Objekte auf dem Bildschirm bleiben. Lesen Sie die Fenstergröße mit love.graphics.getWidth und getHeight aus und begrenzen Sie anschließend die Koordinaten.

Mit math.max und math.min zusammen können Sie einen Wert zuverlässig zwischen einem Minimum und einem Maximum begrenzen.

local w = love.graphics.getWidth()
player.x = math.max(0, math.min(player.x, w - player.size))

Achsenparallele Bounding-Boxen

Die einfachste Kollisionserkennung verwendet Rechtecke, die als AABB (achsenparallele Bounding-Boxen) bezeichnet werden. Jedes Objekt besitzt x, y, eine Breite und eine Höhe.

Zwei Boxen überlappen, wenn sie sich gleichzeitig auf der horizontalen und der vertikalen Achse überschneiden. Diese Prüfung ist schnell und für die meisten 2D-Spiele ausreichend.

-- box: { x, y, w, h }

Der AABB-Überlappungstest

Zwei Rechtecke überlappen, wenn auf keiner der beiden Achsen die linke Kante des einen hinter der rechten Kante des anderen liegt. Der klassische Test kombiniert vier Vergleiche.

Wenn alle vier Bedingungen erfüllt sind, schneiden sich die Boxen. Diese einzelne Bedingung bildet das Arbeitspferd der 2D-Kollisionserkennung.

function overlaps(a, b)
  return a.x < b.x + b.w and
         b.x < a.x + a.w and
         a.y < b.y + b.h and
         b.y < a.y + a.h
end

Auf eine Kollision reagieren

Sobald overlaps true zurückgibt, entscheiden Sie, was passieren soll: eine Münze aufnehmen, Schaden erleiden oder die Bewegung stoppen. Prüfen Sie Kollisionen in love.update, nachdem Sie die Bewegung angewendet haben.

Bei aufnehmbaren Objekten entfernen Sie einfach den Gegenstand oder erhöhen den Punktestand. Bei soliden Wänden schieben Sie die Spielfigur wieder hinaus.

function love.update(dt)
  movePlayer(dt)
  if overlaps(player, coin) then
    score = score + 1
    coin.dead = true
  end
end

Kollisionen von Kreisen

Bei runden Objekten ist eine distanzbasierte Kollisionserkennung genauer. Zwei Kreise kollidieren, wenn der Abstand zwischen ihren Mittelpunkten kleiner als die Summe ihrer Radien ist.

Der Vergleich quadrierter Abstände vermeidet die aufwendige Quadratwurzel und ist eine gängige Optimierung, wenn viele Objekte geprüft werden.

function circlesHit(a, b)
  local dx, dy = a.x - b.x, a.y - b.y
  local rsum = a.r + b.r
  return dx*dx + dy*dy < rsum*rsum
end

Kollisionen mit Wänden auflösen

Um eine Spielfigur an einer Wand anzuhalten, können Sie sie auf jeder Achse separat bewegen und einen Schritt rückgängig machen, der eine Überlappung verursacht.

Bewegen Sie x und prüfen Sie die Kollision. Falls es zu einer Kollision kommt, setzen Sie x zurück. Wiederholen Sie das für y. Diese achsengetrennte Auflösung verhindert, dass die Figur an Ecken hängen bleibt.

player.x = player.x + vx * dt
if overlaps(player, wall) then player.x = player.x - vx * dt end
player.y = player.y + vy * dt
if overlaps(player, wall) then player.y = player.y - vy * dt end

Schwerkraft anwenden

Plattformspiele fügen eine konstante Beschleunigung nach unten hinzu. Erhöhen Sie in jedem Frame die vertikale Geschwindigkeit um Schwerkraft mal dt und wenden Sie die Geschwindigkeit anschließend auf die Position an.

Wenn die Spielfigur auf dem Boden landet, setzen Sie die vertikale Geschwindigkeit auf null, damit sie nicht weiter fällt. Beim Springen wird eine negative vertikale Geschwindigkeit gesetzt.

function love.update(dt)
  player.dy = player.dy + GRAVITY * dt
  player.y = player.y + player.dy * dt
end

Nicht mehr benötigte Objekte entfernen

Nach Kollisionen entfernen Sie häufig Objekte. Durchlaufen Sie eine Liste rückwärts und rufen Sie table.remove auf, damit die Indizes beim Löschen gültig bleiben.

Die Rückwärtsiteration ist das sichere Lua-Idiom zum Entfernen von Elementen innerhalb einer Schleife. So vermeiden Sie übersprungene Einträge, die bei einer Vorwärtsiteration entstehen würden.

for i = #coins, 1, -1 do
  if coins[i].dead then
    table.remove(coins, i)
  end
end

Kurzer Test

Testen Sie Ihr Verständnis von Bewegung und Kollisionen in LÖVE.

Zusammenfassung

Bewegung kombiniert Position, Geschwindigkeit und dt. Für faire diagonale Bewegung wird normalisiert und für den Verbleib auf dem Bildschirm werden Positionen begrenzt. Kollisionen beginnen mit AABB-Überlappungstests; für runde Objekte eignen sich Distanzprüfungen mit Kreisen.

Lösen Sie Wandkollisionen, indem Sie Bewegungen pro Achse zurücksetzen, fügen Sie für Plattformspiele Schwerkraft hinzu und entfernen Sie nicht mehr benötigte Objekte durch Rückwärtsiteration mit table.remove.

Häufig gestellte Fragen

Ist die Lektion „Bewegung und Kollisionen“ kostenlos?

Ja — der vollständige Text von „Bewegung und Kollisionen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Bewegung und Kollisionen“?

Erstellen Sie eine spielbare Szene. Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Bewegung und Kollisionen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die LOVE-Game-Loop
  2. Formen und Bilder zeichnen
  3. Eingaben behandeln
  4. Bewegung und Kollisionen
← Zurück zu Lua Academy