From 07ffb903dd30bc855692e36a37d3503d5a6cec75 Mon Sep 17 00:00:00 2001 From: ne_mene Date: Sat, 14 Mar 2026 11:50:03 +0100 Subject: coyote time --- src/objs/player.lua | 31 ++++++++++++++++++++-------- src/objs/specks.lua | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/objs/specks.lua (limited to 'src') diff --git a/src/objs/player.lua b/src/objs/player.lua index 84e42f0..7812486 100644 --- a/src/objs/player.lua +++ b/src/objs/player.lua @@ -5,7 +5,12 @@ local PLAYER_JUMP_FORCE = 350 local PLAYER_DASH_TIMER = 0.15 local PLAYER_DASH_COOLDOWN = 0.5 -register_comp("Player", TAGCOMP) +local COYOTE = 0.1 + +register_comp("Player", function(player) + player.jump_input_timer = 0 + player.grounded_timer = 0 +end) local function player_normal_state_init(state) state.dash_cooldown = 0 @@ -31,14 +36,13 @@ local function player_normal_state_update(player, state, dt) player.sprite:set_tag("idle") end - if player.box:touching_down() then - if is_input_just_pressed("Jump") then + if player.grounded_timer > 0 then + if player.jump_input_timer > 0 then player.vy = -PLAYER_JUMP_FORCE end - else - if is_input_just_released("Jump") and player.vy < -100 then - player.vy = -100 - end + end + if not is_input_pressed("Jump") and player.vy < -100 then + player.vy = -100 end if state.dash_cooldown <= 0 and is_input_just_pressed("Dash") then @@ -75,6 +79,16 @@ function player_update_sys(player, dt) if player.vx ~= 0 then player.scalex = sign(player.vx) end + + player.jump_input_timer = player.jump_input_timer - dt + if is_input_just_pressed("Jump") then + player.jump_input_timer = COYOTE + end + + player.grounded_timer = player.grounded_timer - dt + if player.box:touching_down() then + player.grounded_timer = COYOTE + end end function new_player(x, y) @@ -86,7 +100,7 @@ function new_player(x, y) offsetx = -4, offsety = -6, layers = {}, - mask = {"Hard"}, + mask = { "Hard" }, }) add_comp(ent, "Sprite", "res/img/player.ase", { @@ -108,4 +122,3 @@ function new_player(x, y) return ent end - diff --git a/src/objs/specks.lua b/src/objs/specks.lua new file mode 100644 index 0000000..a3a21c5 --- /dev/null +++ b/src/objs/specks.lua @@ -0,0 +1,59 @@ +Speck_Sys = {} +Speck_Sys.__index = Speck_Sys + +function Speck_Sys.new(texture) + local self = setmetatable({}, Speck_Sys) + + self.data = { + size = 0, + pos = {}, + vel = {}, + + lifetime = {}, + lifetime_max = {}, + + scale_start = {}, + scale_end = {} + } + + self.scale_curve = lerp + self.scale_min = 1 + self.scale_max = 1 + + self.scale_end_min = 1 + self.scale_end_max = 1 + + self.texture = texture +end + +function Speck_Sys:process(dt) + local data = self.data + + for i = 1, data.size do + -- dead particles skip + if data.lifetime[i] <= 0 then + goto next_speck_process + end + + data.pos[i].x = data.pos[i].x + data.vel[i].x * dt + data.pos[i].y = data.pos[i].y + data.vel[i].y * dt + + data.lifetime[i] = data.lifetime[i] - dt + + ::next_speck_process:: + end +end + +function Speck_Sys:draw() + local scale_curve = self.scale_curve + local data = self.data + + for i = 1, data.size do + local anim = data.lifetime[i] / data.lifetime_max[i] + local scale = scale_curve(self.scale_start, self.scale_end, anim) + + lg.draw( + self.texture, data.pos[i].x, data.pos[i].y + ) + end +end -- cgit v1.3-2-g0d8e