Speck_Sys = {} Speck_Sys.__index = Speck_Sys function Speck_Sys.new() local self = setmetatable({}, Speck_Sys) self.data = { size = 0, pos = {}, vel = {}, lifetime = {}, lifetime_max = {}, scale_start = {}, scale_end = {} } self.scale_curve = lerp self.scale_start_min = 1 self.scale_start_max = 1 self.scale_end_min = 0 self.scale_end_max = 0 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: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 if data.lifetime[i] <= 0 then goto next_speck_update 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_update:: end end function Speck_Sys:draw() local scale_curve = self.scale_curve local data = self.data for i = 1, data.size do 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, 0, scale ) ::next_speck_draw:: end end 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