From 2f44ed090c9456beae47fc51457b7fc19208fb0c Mon Sep 17 00:00:00 2001 From: ne_mene Date: Tue, 17 Mar 2026 10:59:57 +0100 Subject: particles working a bit --- main.lua | 3 +++ src/objs/player.lua | 1 + src/objs/specks.lua | 71 +++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/main.lua b/main.lua index f6ea661..c909c95 100644 --- a/main.lua +++ b/main.lua @@ -10,9 +10,12 @@ function love.load() event_bind(scn.on_update, "Player", player_update_sys) event_bind(scn.on_update, "State_Machine", state_update_sys) event_bind(scn.on_update, "Sprite", sprite_anim_sys) + event_bind(scn.on_update, "Sprite", sprite_anim_sys) + event_bind(scn.on_update, "Speck_System", speck_update_sys) event_bind(scn.on_draw, "Sprite", sprite_draw_sys) event_bind(scn.on_draw, "Tilemap", tilemap_draw_sys) + event_bind(scn.on_draw, "Speck_System", speck_draw_sys) event_bind(scn.on_update, "Room_Editor", room_editor_ui_sys) event_bind(scn.on_ui, "Room_Editor", tile_place_sys) diff --git a/src/objs/player.lua b/src/objs/player.lua index 7812486..4f05c3b 100644 --- a/src/objs/player.lua +++ b/src/objs/player.lua @@ -95,6 +95,7 @@ function new_player(x, y) local ent = new_entity() add_comp(ent, "Player") + add_comp(ent, "Speck_System") add_comp(ent, "Body", x, y, 8, 14, { offsetx = -4, 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 -- cgit v1.3-2-g0d8e