diff options
| author | ne_mene <[email protected]> | 2026-04-07 12:48:44 +0200 |
|---|---|---|
| committer | ne_mene <[email protected]> | 2026-04-07 12:48:44 +0200 |
| commit | 6bf272a5d79e82532ffe48bd8257cb0a0852be73 (patch) | |
| tree | 98a9ff1974be384390057159d007d1b86c4c48a9 /src/camera.lua | |
| parent | f700e24910648802642950499be0af601a34cefd (diff) | |
camera shake
Diffstat (limited to 'src/camera.lua')
| -rw-r--r-- | src/camera.lua | 46 |
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 |
