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 self.x = 0 self.y = 0 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 register_comp("Specks", function (ent) ent.specks = Speck_Sys.new("res/img/speck.png") end)