aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorne_mene <[email protected]>2026-03-17 10:59:57 +0100
committerne_mene <[email protected]>2026-03-17 10:59:57 +0100
commit2f44ed090c9456beae47fc51457b7fc19208fb0c (patch)
treea0be812ac0c892fd29d3e82b84ca65bcf828cf8e
parentc405cb81de9dba2ff8947870c09650bda7533550 (diff)
particles working a bit
-rw-r--r--main.lua3
-rw-r--r--src/objs/player.lua1
-rw-r--r--src/objs/specks.lua71
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