diff options
| author | ne_mene <[email protected]> | 2026-04-09 14:07:36 +0200 |
|---|---|---|
| committer | ne_mene <[email protected]> | 2026-04-09 14:07:36 +0200 |
| commit | 3ee034d0b6533be0e8cb1cb12ff10449641770d1 (patch) | |
| tree | c9e4366f3f63b3e8cc9b36550ab585693750cf03 | |
| parent | b4d4e4bd6c25655dd0f7bd5f6b377a74429bf012 (diff) | |
directional camera shake
| -rw-r--r-- | src/camera.lua | 55 | ||||
| -rw-r--r-- | src/objs/player.lua | 2 |
2 files changed, 40 insertions, 17 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)) diff --git a/src/objs/player.lua b/src/objs/player.lua index 6d15058..f7806f3 100644 --- a/src/objs/player.lua +++ b/src/objs/player.lua @@ -45,7 +45,7 @@ local function player_normal_state_update(player, state, dt) player.vy = -PLAYER_JUMP_FORCE player.jumps = player.jumps - 1 new_speck_entity(player.x, player.y, "res/speck/test.speck.lua") - player.camera:shake(12, 0.1) + player.camera:shake(12, 0.1, 90) end end if not is_input_pressed("Jump") and player.vy < -100 then |
