[feature] Basic collision

This commit is contained in:
Oliver Dressler
2025-09-12 06:14:06 +02:00
parent 30ce11a281
commit 2c37b0c687

View File

@@ -99,6 +99,13 @@ def castRay (map : Map) (startX startY angle : Float): Float × Float := Id.run
let texX := (wallX - wallX.floor) * TEXTURE_SIZE let texX := (wallX - wallX.floor) * TEXTURE_SIZE
(distance, texX) (distance, texX)
def checkCollision (map : Map) (x y : Float) (radius : Float := 0.3) : Bool :=
let corners := #[
(x - radius, y - radius), (x + radius, y - radius),
(x - radius, y + radius), (x + radius, y + radius)
]
corners.any (fun (cx, cy) => isWall map cx cy)
def updateCamera (camera : Camera) (deltaTime : Float) : IO Camera := do def updateCamera (camera : Camera) (deltaTime : Float) : IO Camera := do
let moveSpeed := camera.speed * deltaTime let moveSpeed := camera.speed * deltaTime
let mut newX := camera.x let mut newX := camera.x
@@ -106,11 +113,17 @@ def updateCamera (camera : Camera) (deltaTime : Float) : IO Camera := do
let mut newAngle := camera.angle let mut newAngle := camera.angle
if isKeyDown .W then if isKeyDown .W then
newX := newX + Float.cos camera.angle * moveSpeed let testX := camera.x + Float.cos camera.angle * moveSpeed
newY := newY + Float.sin camera.angle * moveSpeed let testY := camera.y + Float.sin camera.angle * moveSpeed
if !checkCollision sampleMap testX camera.y then newX := testX
if !checkCollision sampleMap camera.x testY then newY := testY
if isKeyDown .S then if isKeyDown .S then
newX := newX - Float.cos camera.angle * moveSpeed let testX := camera.x - Float.cos camera.angle * moveSpeed
newY := newY - Float.sin camera.angle * moveSpeed let testY := camera.y - Float.sin camera.angle * moveSpeed
if !checkCollision sampleMap testX camera.y then newX := testX
if !checkCollision sampleMap camera.x testY then newY := testY
if isKeyDown .A then newAngle := newAngle - camera.turnSpeed * deltaTime if isKeyDown .A then newAngle := newAngle - camera.turnSpeed * deltaTime
if isKeyDown .D then newAngle := newAngle + camera.turnSpeed * deltaTime if isKeyDown .D then newAngle := newAngle + camera.turnSpeed * deltaTime