Particle = Entity:New(x,y) 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) } if particle_data.light ~= nil then o.lightRange = particle_data.light o.light = CreateLight(o.pos.x,o.pos.y,o.lightRange) end -- animations o.body = Animation:New(particle_data.animation) o:centerOffset(o.body) if not o.animation_active then o.body.speed = 0 end table.insert(LoadedParticles,o) o.id = #LoadedParticles setmetatable(o, self) self.__index = self return o end function Particle:Kill() if self.light ~= nil then KillLight(self.light) end if self.id ~= nil then for _, e in pairs(LoadedParticles) do if e.id > self.id then e.id = e.id - 1 end end table.remove(LoadedParticles,self.id) end self = nil end function Particle:HandleAnimation() self.body:Animate() 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.light.range = self.lightRange * self.sprite_alpha/2 end if self.sprite_alpha < 0 then self:Kill() end self:Draw(self.body) end function Particle:DoPhysics() if not self:isCollidingAt(self.pos.x + self.vel.x, self.pos.y, objects.collisions) then self.pos.x = self.pos.x + self.vel.x end if not self:isCollidingAt(self.pos.x, self.pos.y + self.vel.y, objects.collisions) then self.pos.y = self.pos.y + self.vel.y end end