Particle = Entity:New(x,y) LoadedObjects.Particles = {} function Particle:New(x,y,particle_data) local o = Entity:New(x,y) o.pos = {x = x, y = y} o.speed = particle_data.speed or 0 o.direction = particle_data.direction or o.direction o.sprite_rotation = particle_data.sprite_rotation or o.sprite_rotation o.sprite_offset = particle_data.sprite_offset or o.sprite_offset o.sprite_scale = particle_data.sprite_scale or o.sprite_scale o.sprite_tint = particle_data.sprite_tint or o.sprite_tint o.sprite_alpha = particle_data.sprite_alpha or o.sprite_alpha o.sprite_alpha_base = o.sprite_alpha o.sprite_flip = particle_data.sprite_flip or o.sprite_flip o.animation_active = particle_data.animation_active or false o.time = 0.5 o.timer = 0 o.vel = { x = o.speed * math.cos(o.direction), y = o.speed * math.sin(o.direction) } o.speed_increase = particle_data.speed_increase or 0 if particle_data.light ~= nil then o.lightRange = particle_data.light local flicker = particle_data.light_flicker or nil local color = particle_data.light_color or nil o.light = Light:New(o.pos.x,o.pos.y,o.lightRange,flicker,color) end -- animations if particle_data.animation ~= nil then o.body = Animation:New(particle_data.animation) o:centerOffset(o.body) o:getBoundingBox(o.body) if not o.animation_active then o.body.speed = 0 end end table.insert(LoadedObjects.Particles,o) o.id = #LoadedObjects.Particles setmetatable(o, self) self.__index = self return o end function Particle:Kill() if self.light ~= nil then self.light:Kill() end if self.id ~= nil then for _, e in pairs(LoadedObjects.Particles) do if e.id > self.id then e.id = e.id - 1 end end table.remove(LoadedObjects.Particles,self.id) end self = nil end function Particle:HandleAnimation() self.timer = self.timer + current_dt self.sprite_alpha = self.sprite_alpha_base*(self.time-self.timer)/self.time if self.light ~= nil then self:LightAdjust() self.light.range = self.lightRange * self.sprite_alpha/2 end if self.sprite_alpha < 0 then self:Kill() end if self.body ~= nil then self.body:Animate() self:Draw(self.body) end end function Particle:DoPhysics() -- adjust speed if self.speed_increase ~= 0 then self.speed = self.speed + self.speed_increase self.vel.x = self.speed * math.cos(self.direction) self.vel.y = self.speed * math.sin(self.direction) end -- move self:CollisionMove() end function Particle:Debug() -- draw center CYAN love.graphics.setColor(0,1,1) love.graphics.circle("fill", -Camera.pos.x + self.pos.x, -Camera.pos.y + self.pos.y, 1) end