Replaced the id system with a simple flag for deletion

This commit is contained in:
lustlion 2022-03-17 11:46:10 +01:00
parent 8edcbe2d9b
commit 410c00dcd4
10 changed files with 74 additions and 62 deletions

View File

@ -36,8 +36,6 @@ function CursedBook:new(x,y)
light_data.color = nil light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data) o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o

View File

@ -19,9 +19,8 @@ function Decoration:new(x,y,animation,light_data)
o.light = Light:new(o.pos.x,o.pos.y,light_data) o.light = Light:new(o.pos.x,o.pos.y,light_data)
end end
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self
return o return o
end end

View File

@ -31,8 +31,6 @@ function Fairy:new(x,y)
o.particle_timer = 0 o.particle_timer = 0
o.particle_time = 5 o.particle_time = 5
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o

View File

@ -14,8 +14,6 @@ function HookAnchor:new(x,y,hook_distance)
o:centerOffset(o.body) o:centerOffset(o.body)
o:createBox(o.body) o:createBox(o.body)
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o

View File

@ -36,8 +36,6 @@ function Kupo:new(x,y)
light_data.color = nil light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data) o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o

View File

@ -22,7 +22,7 @@ function Particle:new(x,y,particle_data)
o.func = particle_data.func or nil o.func = particle_data.func or nil
o.time = particle_data.time or nil o.time = particle_data.time or nil
if o.time ~= nil then if o.time then
if particle_data.time_unit ~= nil if particle_data.time_unit ~= nil
and particle_data.time_unit == "frames" then and particle_data.time_unit == "frames" then
o.time = o.time o.time = o.time
@ -37,7 +37,7 @@ function Particle:new(x,y,particle_data)
y = o.speed * math.sin(o.direction) y = o.speed * math.sin(o.direction)
} }
if particle_data.light ~= nil then if particle_data.light then
local light_data = {} local light_data = {}
light_data.radius = particle_data.light light_data.radius = particle_data.light
light_data.shine_radius = particle_data.light_shine or nil light_data.shine_radius = particle_data.light_shine or nil
@ -47,34 +47,24 @@ function Particle:new(x,y,particle_data)
end end
-- animations -- animations
if particle_data.animation ~= nil then if particle_data.animation then
o.body = Animation:new(particle_data.animation,particle_data.animation_speed) o.body = Animation:new(particle_data.animation,particle_data.animation_speed)
o:centerOffset(o.body) o:centerOffset(o.body)
o:createBox(o.body) o:createBox(o.body)
end end
-- particle id handled differently from other entities table.remove(LoadedObjects.Entities,#LoadedObjects.Entities)
table.insert(LoadedObjects.Particles,o) table.insert(LoadedObjects.Particles,o)
o.id = #LoadedObjects.Particles
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o
end end
function Particle:kill() function Particle:kill()
if self.light ~= nil then if self.light then
self.light:kill() self.light:kill()
end end
if self.id ~= nil then self.dead = true
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 end
function Particle:handleAnimation() function Particle:handleAnimation()
@ -84,7 +74,7 @@ function Particle:handleAnimation()
self.sprite_alpha = self.sprite_alpha_base*(self.time-self.timer)/self.time self.sprite_alpha = self.sprite_alpha_base*(self.time-self.timer)/self.time
end end
if self.body ~= nil then if self.body then
self.body:animate() self.body:animate()
self:draw(self.body) self:draw(self.body)
end end
@ -100,6 +90,15 @@ function Particle:doLogic()
end end
end end
function cleanDeadParticles()
for i=1, #LoadedObjects.Particles do
part = LoadedObjects.Particles[i]
if part.kill then
table.remove(LoadedObjects.Particles,i)
end
end
end
function Particle:doPhysics() function Particle:doPhysics()
-- horizontal collision -- horizontal collision
self:moveX( self:moveX(
@ -118,3 +117,16 @@ function Particle:debug()
love.graphics.setColor(0,1,1) love.graphics.setColor(0,1,1)
love.graphics.circle("fill", -Camera.pos.x + self.pos.x, -Camera.pos.y + self.pos.y, 1) love.graphics.circle("fill", -Camera.pos.x + self.pos.x, -Camera.pos.y + self.pos.y, 1)
end end
---------------
function cleanDeadParticles()
for i=1, #LoadedObjects.Particles do
part = LoadedObjects.Particles[i]
if part and part.dead then
table.remove(LoadedObjects.Particles,i)
end
end
end
---------------

View File

@ -80,8 +80,6 @@ function Player:new(x,y)
light_data.color = nil light_data.color = nil
o.light = Light:new(o.pos.x,o.pos.y,light_data) o.light = Light:new(o.pos.x,o.pos.y,light_data)
o:id()
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
return o return o

View File

@ -24,15 +24,12 @@ function Entity:new(x,y)
o.sprite_alpha = 1 o.sprite_alpha = 1
o.sprite_flip = { x = 1, y = 1} o.sprite_flip = { x = 1, y = 1}
table.insert(LoadedObjects.Entities,o)
setmetatable(o, self) setmetatable(o, self)
self.__index = self
return o return o
end end
function Entity:id()
table.insert(LoadedObjects.Entities,self)
self.id = #LoadedObjects.Entities
end
function Entity:checkNearest(type,maxdistance) function Entity:checkNearest(type,maxdistance)
local return_entity = nil local return_entity = nil
local shortest = -1 local shortest = -1
@ -64,9 +61,6 @@ function Entity:checkNearest(type,maxdistance)
return return_entity return return_entity
end end
function Entity:doLogic()
end
function Entity:moveX(amount, func) function Entity:moveX(amount, func)
self.move_remainder.x = self.move_remainder.x + amount self.move_remainder.x = self.move_remainder.x + amount
local move = math.round(self.move_remainder.x) local move = math.round(self.move_remainder.x)
@ -130,15 +124,7 @@ function Entity:kill()
if self.light ~= nil then if self.light ~= nil then
self.light:kill() self.light:kill()
end end
if self.id ~= nil then self.dead = true
table.remove(LoadedObjects.Entities,self.id)
for _, e in pairs(LoadedObjects.Entities) do
if e.id > self.id then
e.id = e.id - 1
end
end
end
self = nil
end end
function Entity:checkVisionLine(entity,range) function Entity:checkVisionLine(entity,range)
@ -306,6 +292,9 @@ function Entity:debug()
end end
end end
function Entity:doLogic()
end
function Entity:doPhysics() function Entity:doPhysics()
end end
@ -315,6 +304,19 @@ end
function Entity:drawBackground() function Entity:drawBackground()
end end
---------------
function cleanDeadEntities()
for i=1, #LoadedObjects.Entities do
enty = LoadedObjects.Entities[i]
if enty.dead then
table.remove(LoadedObjects.Entities,i)
end
end
end
---------------
require "code/entities/kupo" require "code/entities/kupo"
require "code/entities/arrow" require "code/entities/arrow"
require "code/entities/decoration" require "code/entities/decoration"

View File

@ -68,6 +68,10 @@ function stepGame()
Demo:startPlayback() Demo:startPlayback()
end end
end end
cleanDeadParticles()
cleanDeadEntities()
cleanDeadLights()
end end
function drawGame() function drawGame()

View File

@ -1,4 +1,6 @@
Light = {} Light = class(nil, {
type = "Light"
})
LoadedObjects.Lights = {} LoadedObjects.Lights = {}
function Light:new(x,y,data) function Light:new(x,y,data)
@ -17,26 +19,12 @@ function Light:new(x,y,data)
o.flicker_time = 60/12 o.flicker_time = 60/12
o.flicker_timer = 0 o.flicker_timer = 0
table.insert(LoadedObjects.Lights,o)
o.id = #LoadedObjects.Lights
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
table.insert(LoadedObjects.Lights,o)
return o return o
end end
function Light:kill()
if self.id ~= nil then
table.remove(LoadedObjects.Lights,self.id)
for _, e in pairs(LoadedObjects.Lights) do
if e.id > self.id then
e.id = e.id - 1
end
end
end
self = nil
end
function Light:flicker() function Light:flicker()
self.flicker_timer = self.flicker_timer + 1 self.flicker_timer = self.flicker_timer + 1
@ -82,3 +70,20 @@ function Light:drawShine()
love.graphics.setShader() love.graphics.setShader()
end end
end end
function Light:kill()
self.dead = true
end
---------------
function cleanDeadLights()
for i=1, #LoadedObjects.Entities do
enty = LoadedObjects.Entities[i]
if enty.dead then
table.remove(LoadedObjects.Entities,i)
end
end
end
---------------