aboutsummaryrefslogtreecommitdiff
path: root/src/camera.lua
diff options
context:
space:
mode:
authorne_mene <[email protected]>2026-04-07 12:48:44 +0200
committerne_mene <[email protected]>2026-04-07 12:48:44 +0200
commit6bf272a5d79e82532ffe48bd8257cb0a0852be73 (patch)
tree98a9ff1974be384390057159d007d1b86c4c48a9 /src/camera.lua
parentf700e24910648802642950499be0af601a34cefd (diff)
camera shake
Diffstat (limited to 'src/camera.lua')
-rw-r--r--src/camera.lua46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/camera.lua b/src/camera.lua
index 31bfe9e..add6ae4 100644
--- a/src/camera.lua
+++ b/src/camera.lua
@@ -1,5 +1,7 @@
local DEFAULT_CAMERA_SMOOTHING = 30
+local SHAKE_NOISE_SPEED = 15
+
Cam = {}
Cam.__index = Cam
@@ -14,12 +16,24 @@ function Cam.new(x, y)
self.smoothing = DEFAULT_CAMERA_SMOOTHING
+ self.shake_strength = 0
+ self.shake_timer_max = 0
+ self.shake_timer = 0
+
+ self.shake_damp = EASING_FUNCTIONS.Lerp
+ self.shake_noise = lmath.noise
+
return self
end
function Cam:update(dt)
self.realx = dlerp(self.realx, self.x, self.smoothing * dt)
self.realy = dlerp(self.realy, self.y, self.smoothing * dt)
+
+ self.shake_timer = self.shake_timer - dt
+ if self.shake_timer < 0 then
+ self.shake_strength = 0
+ end
end
local active_cam = Cam.new()
@@ -28,6 +42,16 @@ function get_active_camera()
return active_cam
end
+function Cam:shake(strength, time)
+ if strength < self.shake_strength then
+ return
+ end
+ self.noise_seed = lmath.random() * 1000
+ self.shake_strength = strength
+ self.shake_timer = time
+ self.shake_timer_max = time
+end
+
function set_active_camera(new_cam)
active_cam = new_cam
end
@@ -35,7 +59,23 @@ end
function use_camera_transform()
local w, h = SCR_WIDTH / 2, SCR_HEIGHT / 2
lg.scale(active_cam.zoom)
- lg.translate(
- round(-active_cam.realx + w / active_cam.zoom),
- round(-active_cam.realy + h / active_cam.zoom))
+ local ox, oy = round(-active_cam.realx + w / active_cam.zoom),
+ round(-active_cam.realy + h / active_cam.zoom)
+
+ local shakex, shakey = 0, 0
+ if active_cam.shake_timer > 0 then
+ shakex = active_cam.shake_noise(
+ active_cam.shake_timer * SHAKE_NOISE_SPEED + active_cam.noise_seed)
+
+ shakey = active_cam.shake_noise(
+ -- 100 is a magic number to offset the x and y noise (so its not just a diagonal shake)
+ active_cam.shake_timer * SHAKE_NOISE_SPEED + active_cam.noise_seed, 100)
+
+ local anim = active_cam.shake_timer / active_cam.shake_timer_max
+ local strength = active_cam.shake_strength * active_cam.shake_damp(0, 1, anim)
+ shakex = shakex * strength
+ shakey = shakey * strength
+ end
+
+ lg.translate(ox + shakex, oy + shakey)
end