aboutsummaryrefslogtreecommitdiff
path: root/src/objs
diff options
context:
space:
mode:
Diffstat (limited to 'src/objs')
-rw-r--r--src/objs/player.lua31
-rw-r--r--src/objs/specks.lua59
2 files changed, 81 insertions, 9 deletions
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