7. Kollisioner utan en fysikmotor
Målet
Förstå varför spelaren stannar vid väggar, varför öppna dörrar slutar blockera och hur du kan felsöka en passage som känns för trång. Three.js ritar objekt men löser inte automatiskt spelkollisioner. Läs blocked() i level.js.
Förenklad form i stället för hela modellen
Varje vägg sparas som en rektangel i X–Z-planet: mittpunkt (x, z) samt bredd w och djup d. Spelaren behandlas som en cirkel med radien 0.28. Funktionen blocked(x, z, radius, obstacles, doors) svarar true om den föreslagna nya platsen är otillåten.
const overlapsWall =
Math.abs(x - wall.x) < wall.w / 2 + radius &&
Math.abs(z - wall.z) < wall.d / 2 + radius;
Detta är ett enkelt överlappningstest, inte en exakt cirkel-mot-rektangel-beräkning. Det är tillräckligt för den här banans långsamma gånghastighet men skulle behöva förbättras för ett snabbare eller mer fysikbaserat spel.
Flytta i två steg
movePlayer(dx, dz) prövar först X och sedan Z. Om X stoppas av en vägg kan Z fortfarande ändras. Det gör att spelaren glider längs väggen i stället för att fastna helt vid diagonal rörelse. Om båda riktningarna testades som en enda ny position skulle rörelsen kunna kännas ryckig i hörn.
De två stängda dörrarna har egna rektangulära spärrar i blocked(). När state.doors[0] blir true tas den första spärren logiskt bort. Dörrens synliga blad roterar separat. Om man bara animerar bladet men glömmer logiken ser dörren öppen ut samtidigt som en osynlig vägg stoppar spelaren.
Kontrollpunkt i spelet
- Gå rakt in i en vägg: du ska stanna.
- Gå snett längs väggen: du ska kunna glida i den fria riktningen.
- Prova första dörren utan nyckel: den ska stoppa dig.
- Ta nyckeln och öppna dörren: kontrollera både animation och passage.
Ändra sedan spelarens radie i din kopia från 0.28 till 0.45. Testa samma passage igen. Om den blir för trång förstår du varför kollisionsmått är en del av bandesignen. Återställ radien när du är klar.
Klart när: du kan peka ut skillnaden mellan en synlig vägg och dess enkla kollisionsform samt beskriva vad som måste ändras när en dörr öppnas.