aboutsummaryrefslogtreecommitdiff
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
parentf700e24910648802642950499be0af601a34cefd (diff)
camera shake
-rw-r--r--src/camera.lua46
-rw-r--r--src/init.lua17
-rw-r--r--src/objs/player.lua1
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