aboutsummaryrefslogtreecommitdiff
path: root/src/camera.lua
diff options
context:
space:
mode:
authorne_mene <[email protected]>2026-04-09 14:07:36 +0200
committerne_mene <[email protected]>2026-04-09 14:07:36 +0200
commit3ee034d0b6533be0e8cb1cb12ff10449641770d1 (patch)
treec9e4366f3f63b3e8cc9b36550ab585693750cf03 /src/camera.lua
parentb4d4e4bd6c25655dd0f7bd5f6b377a74429bf012 (diff)
directional camera shake
Diffstat (limited to 'src/camera.lua')
-rw-r--r--src/camera.lua55
1 files changed, 39 insertions, 16 deletions
diff --git a/src/camera.lua b/src/camera.lua
index 81f1657..e128c69 100644
--- a/src/camera.lua
+++ b/src/camera.lua
@@ -19,6 +19,7 @@ function Cam.new(x, y)
self.shake_strength = 0
self.shake_timer_max = 0
self.shake_timer = 0
+ self.shake_direction = 0
self.shake_damp = EASING_FUNCTIONS.Lerp
self.shake_noise = lmath.noise
@@ -42,10 +43,15 @@ function get_active_camera()
return active_cam
end
-function Cam:shake(strength, time)
+function Cam:shake(strength, time, angle)
if strength < self.shake_strength then
return
end
+
+ self.shake_direction = angle -- if nil we just ignore it and randomize
+ if self.shake_direction then
+ self.shake_direction = math.rad(self.shake_direction)
+ end
self.noise_seed = lmath.random() * 1000
self.shake_strength = strength
self.shake_timer = time
@@ -56,27 +62,44 @@ function set_active_camera(new_cam)
active_cam = new_cam
end
-function use_camera_transform()
- local w, h = SCR_WIDTH / 2, SCR_HEIGHT / 2
- lg.scale(active_cam.zoom)
- local ox, oy = -active_cam.realx + w / active_cam.zoom,
- -active_cam.realy + h / active_cam.zoom
+function Cam:getshake()
+ if self.shake_timer < 0 then
+ return 0, 0
+ end
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)
+ if self.shake_direction then
+ local size = self.shake_noise(
+ self.shake_timer * SHAKE_NOISE_SPEED + self.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)
+ shakex = math.cos(self.shake_direction) * size
+ shakey = math.sin(self.shake_direction) * size
+
+ else
+ shakex = self.shake_noise(
+ self.shake_timer * SHAKE_NOISE_SPEED + self.noise_seed)
- 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
+ shakey = self.shake_noise(
+ -- 100 is a magic number to offset the x and y noise (so its not just a diagonal shake)
+ self.shake_timer * SHAKE_NOISE_SPEED + self.noise_seed, 100)
end
+ local anim = self.shake_timer / self.shake_timer_max
+ local strength = self.shake_strength * self.shake_damp(0, 1, anim)
+
+ shakex = shakex * strength
+ shakey = shakey * strength
+ return shakex, shakey
+end
+
+function use_camera_transform()
+ local w, h = SCR_WIDTH / 2, SCR_HEIGHT / 2
+ lg.scale(active_cam.zoom)
+ local ox, oy = -active_cam.realx + w / active_cam.zoom,
+ -active_cam.realy + h / active_cam.zoom
+
+ local shakex, shakey = active_cam:getshake()
+
lg.translate(
round(ox + shakex),
round(oy + shakey))