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 | |
| parent | f700e24910648802642950499be0af601a34cefd (diff) | |
camera shake
Diffstat (limited to 'src')
| -rw-r--r-- | src/camera.lua | 46 | ||||
| -rw-r--r-- | src/init.lua | 17 | ||||
| -rw-r--r-- | src/objs/player.lua | 1 |
3 files changed, 53 insertions, 11 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 diff --git a/src/init.lua b/src/init.lua index 29cb64d..c77bb18 100644 --- a/src/init.lua +++ b/src/init.lua @@ -1,3 +1,12 @@ +li = love.image +la = love.audio +lg = love.graphics +lf = love.filesystem +lw = love.window +lk = love.keyboard +lm = love.mouse +lmath = love.math + require "src.events" require "src.ecs" require "src.utils" @@ -29,14 +38,6 @@ register_input("Hot_Reload", {{"key", "r"}}) register_input("Right_Click", {{"mouse", 2}}) register_input("Left_Click", {{"mouse", 1}}) -li = love.image -la = love.audio -lg = love.graphics -lf = love.filesystem -lw = love.window -lk = love.keyboard -lm = love.mouse -lmath = love.math function init_global_systems() event_bind(global_on_update, "Body", body_sys) diff --git a/src/objs/player.lua b/src/objs/player.lua index 5c7da0f..6d15058 100644 --- a/src/objs/player.lua +++ b/src/objs/player.lua @@ -45,6 +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) end end if not is_input_pressed("Jump") and player.vy < -100 then |
