Bevegelse og kollisjoner
Lag en spillbar scene.
Bevegelse og kollisjoner er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Posisjon og hastighet
Bevegelse i LÖVE betyr å endre et objekts posisjon over tid. Lagre x og y, og legg deretter til hastigheten i love.update, skalert med dt.
Ved å lagre hastigheten som dx og dy per sekund blir diagonal bevegelse og fysikk ryddig og uavhengig av bildefrekvensen.
function love.update(dt)
player.x = player.x + player.dx * dt
player.y = player.y + player.dy * dt
endBevegelse styrt av inndata
Kombiner avspørring med hastighet for å styre et objekt. Les retningstastene i love.update og bruk hastighet multiplisert med dt.
Ettersom love.keyboard.isDown kontrolleres for hver ramme, beveger spilleren seg jevnt så lenge tasten holdes nede.
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
endNormalisering av diagonal hastighet
Når De trykker på to retningstaster samtidig, blir den diagonale bevegelsen raskere fordi begge aksene bidrar med full hastighet. Løs dette ved å normalisere bevegelsesvektoren.
Del retningen på lengden slik at størrelsen blir 1, og multipliser deretter med hastigheten. Da samsvarer diagonal bevegelse med bevegelse i rett linje.
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
endHolde seg innenfor skjermen
Begrens posisjonen slik at objekter holder seg på skjermen. Les vindusstørrelsen med love.graphics.getWidth og getHeight, og begrens deretter koordinatene.
math.max og math.min kan sammen begrense en verdi mellom en minimums- og en maksimumsverdi på en ryddig måte.
local w = love.graphics.getWidth()
player.x = math.max(0, math.min(player.x, w - player.size))Aksejusterte avgrensningsbokser
Den enkleste kollisjonstesten bruker rektangler, kalt AABB for aksejusterte avgrensningsbokser. Hvert objekt har x, y, bredde og høyde.
To bokser overlapper når de skjærer hverandre på både den horisontale og den vertikale aksen samtidig. Denne kontrollen er rask og god nok for de fleste 2D-spill.
-- box: { x, y, w, h }AABB-overlappstesten
To rektangler overlapper når ingen av dem ligger helt til høyre eller helt under det andre. Den klassiske testen kombinerer fire sammenligninger.
Hvis alle fire er sanne, skjærer boksene hverandre. Denne ene betingelsen er arbeidshesten i 2D-kollisjonsdeteksjon.
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
endReagere på en kollisjon
Når overlaps returnerer true, må De bestemme hva som skal skje: plukk opp en mynt, ta skade eller stopp bevegelsen. Kontroller kollisjoner i love.update etter at objektet er flyttet.
For samleobjekter kan De ganske enkelt fjerne elementet eller øke poengsummen. For solide vegger skyver De spilleren ut igjen.
function love.update(dt)
movePlayer(dt)
if overlaps(player, coin) then
score = score + 1
coin.dead = true
end
endSirkelskollisjoner
For runde objekter er avstandsbasert kollisjonsdeteksjon mer nøyaktig. To sirkler kolliderer når avstanden mellom sentrene er mindre enn summen av radiene.
Ved å sammenligne kvadrerte avstander unngår De den kostbare kvadratroten. Dette er en vanlig optimalisering når mange objekter skal kontrolleres.
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
endLøse veggkollisjoner
For å stoppe en spiller ved en vegg kan De flytte langs hver akse separat og angre et trinn som fører til overlapp.
Flytt x og test; tilbakestill x hvis det oppstår en kollisjon. Gjenta for y. Denne akseseparerte løsningen hindrer at spilleren setter seg fast i hjørner.
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 endBruke tyngdekraft
Plattformspill legger til en konstant akselerasjon nedover. Øk den vertikale hastigheten med tyngdekraft multiplisert med dt for hver ramme, og bruk deretter hastigheten til å oppdatere posisjonen.
Når spilleren lander på bakken, setter De den vertikale hastigheten til null slik at spilleren slutter å falle. Hopping setter en negativ vertikal hastighet.
function love.update(dt)
player.dy = player.dy + GRAVITY * dt
player.y = player.y + player.dy * dt
endFjerne døde objekter
Etter kollisjoner fjerner De ofte objekter. Iterer gjennom en liste baklengs og kall table.remove, slik at indeksene forblir gyldige mens elementer slettes.
Baklengs iterasjon er den trygge Lua-konvensjonen for å fjerne elementer midt i en løkke. Den unngår at elementer hoppes over, slik det kan skje ved forlengs iterasjon.
for i = #coins, 1, -1 do
if coins[i].dead then
table.remove(coins, i)
end
endKort test
Test forståelsen Deres av bevegelse og kollisjoner i LÖVE.
Oppsummering
Bevegelse kombinerer posisjon, hastighet og dt, med normalisering for rettferdig diagonal bevegelse og begrensning for å holde objekter på skjermen. Kollisjoner starter med AABB-overlappstester, med avstandstester mellom sirkler for runde objekter.
Løs vegger ved å tilbakestille bevegelser langs hver akse, legg til tyngdekraft for plattformspill, og fjern døde objekter ved å iterere baklengs med table.remove.
Lær deg Lua med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 40
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Bevegelse og kollisjoner» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Bevegelse og kollisjoner», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bevegelse og kollisjoner»?
Lag en spillbar scene. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Lua Academy?
Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Bevegelse og kollisjoner»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?
Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- LOVE-spilløkken
- Tegn former og bilder
- Håndter inndata
- Bevegelse og kollisjoner