diff options
| author | ne_mene <[email protected]> | 2026-03-17 10:59:57 +0100 |
|---|---|---|
| committer | ne_mene <[email protected]> | 2026-03-17 10:59:57 +0100 |
| commit | 2f44ed090c9456beae47fc51457b7fc19208fb0c (patch) | |
| tree | a0be812ac0c892fd29d3e82b84ca65bcf828cf8e /src/objs/specks.lua | |
| parent | c405cb81de9dba2ff8947870c09650bda7533550 (diff) | |
particles working a bit
Diffstat (limited to 'src/objs/specks.lua')
| -rw-r--r-- | src/objs/specks.lua | 71 |
1 files changed, 55 insertions, 16 deletions
diff --git a/src/objs/specks.lua b/src/objs/specks.lua index a01e233..34bc342 100644 --- a/src/objs/specks.lua +++ b/src/objs/specks.lua @@ -1,7 +1,7 @@ Speck_Sys = {} Speck_Sys.__index = Speck_Sys -function Speck_Sys.new(texture) +function Speck_Sys.new() local self = setmetatable({}, Speck_Sys) self.data = { @@ -17,25 +17,49 @@ function Speck_Sys.new(texture) } self.scale_curve = lerp - self.scale_min = 1 - self.scale_max = 1 + self.scale_start_min = 1 + self.scale_start_max = 1 - self.scale_end_min = 1 - self.scale_end_max = 1 + self.scale_end_min = 0 + self.scale_end_max = 0 - self.texture = texture + self.lifetime_min = 1 + self.lifetime_max = 5 + + self.interval = 0.1 + self.spawn_timer = self.interval + + self.texture = get_tex("res/img/speck.png") self.x = 0 self.y = 0 + return self end -function Speck_Sys:process(dt) +function Speck_Sys:update(dt) local data = self.data + self.spawn_timer = self.spawn_timer - dt + if self.spawn_timer <= 0 then + self.spawn_timer = self.interval + + data.size = data.size + 1 + data.pos[data.size] = { x = self.x, y = self.y } + data.vel[data.size] = { x = 0, y = 0 } + + data.lifetime[data.size] = lmath.random( + self.lifetime_min, self.lifetime_max) + data.lifetime_max[data.size] = data.lifetime[data.size] + + data.scale_start[data.size] = lmath.random( + self.scale_start_min, self.scale_start_max) + data.scale_end[data.size] = lmath.random( + self.scale_end_min, self.scale_end_max) + end + for i = 1, data.size do - -- dead particles skip if data.lifetime[i] <= 0 then - goto next_speck_process + goto next_speck_update end data.pos[i].x = data.pos[i].x + data.vel[i].x * dt @@ -43,7 +67,7 @@ function Speck_Sys:process(dt) data.lifetime[i] = data.lifetime[i] - dt - ::next_speck_process:: + ::next_speck_update:: end end @@ -52,16 +76,31 @@ function Speck_Sys:draw() 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) + if data.lifetime[i] <= 0 then + goto next_speck_draw + end + + local anim = 1 - data.lifetime[i] / data.lifetime_max[i] + local scale = scale_curve(data.scale_start[i], data.scale_end[i], anim) lg.draw( - self.texture, data.pos[i].x, data.pos[i].y + self.texture, data.pos[i].x, data.pos[i].y, 0, scale ) + ::next_speck_draw:: end end -register_comp("Specks", function (ent) - ent.specks = Speck_Sys.new("res/img/speck.png") - +register_comp("Speck_System", function(ent) + ent.speck_sys = Speck_Sys.new() end) + +function speck_update_sys(ent, dt) + ent.speck_sys.x = ent.x + ent.speck_sys.y = ent.y + + ent.speck_sys:update(dt) +end + +function speck_draw_sys(ent) + ent.speck_sys:draw() +end |
