aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/camera.lua55
-rw-r--r--src/objs/player.lua2
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