如何在 Corona 中循环 table?
How to loop through a table in Corona?
今天使用LÖVE一段时间后,偶然发现了Corona SDK。我偶然发现了一个我似乎无法解决的问题。子弹确实会生成,但它们会保持不动。是否有另一种方法可以更新每个 Bullet 或我做错了什么?
Bullets = {}
Bullets.__index = Bullets
function Bullets.new()
local this = {}
this.x = Player.x
this.remove = false
this.dir = math.random(1,2)
this.timer = 0
this.velocity = math.random(2,5)
if this.dir == 1 then
this.y = display.actualContentHeight
elseif this.dir == 2 then
this.y = 0
end
this.rect = display.newRect(this.x,this.y,math.random(5,10),math.random(5,10))
this.rect:setFillColor(0)
return setmetatable(this,Bullets)
end
function Bullets.update(self,event)
self:move()
end
function Bullets.move(self)
if self.dir == 1 then
self.y = self.y + self.velocity
elseif self.dir == 2 then
self.y = self.y - self.velocity
end
end
function Bullets.destroy(self)
self.remove = true
end
Bullets.enterFrame = Bullets.update
Runtime:addEventListener("enterFrame",Bullets)
timer.performWithDelay(500,Bullets.new,0)
在 LÖVE 中,我可以使用以下方式更新每个单独的 Bullet:
function love.update(dt)
for _,v in ipairs(Bullets) do v:update(dt) end
end
根据你在 Love 中使用的循环,我会让 Bullets
成为一个 Bullet
的数组,你的更新函数应该像你在 Love 中那样循环。所以你需要一些修复:
1) 将您发布的代码中的所有地方 Bullets
更改为 Bullet
2) 替换这些行
Bullets.enterFrame = Bullets.update
Runtime:addEventListener("enterFrame",Bullets)
timer.performWithDelay(500,Bullets.new,0)
和
lastTime = 0
function updateBullets(event)
local dt = lastTime - event.time
lastTime = event.time
for _,v in ipairs(Bullets) do v:update(dt) end
end
Runtime:addEventListener("enterFrame",updateBullets)
timer.performWithDelay(500,Bullet.new,0)
3) 使 new()
添加新项目符号到 Bullets
列表:
function Bullet.new()
local this = {}
table.insert(Bullets, this)
... rest is same...
end
4)(可能,见后注)使子弹在被摧毁时从子弹列表中删除:
function Bullet.destroy(self)
self.remove = true
remove = find_bullet_in_bullets_list(self)
table.remove(Bullets, remove)
end
根据您对 self.remove = true
的使用,可能不需要最后一步 4 我猜您对 "marking for deletion" 和 "actually delete" 有不同的阶段,但您得到了主意。
今天使用LÖVE一段时间后,偶然发现了Corona SDK。我偶然发现了一个我似乎无法解决的问题。子弹确实会生成,但它们会保持不动。是否有另一种方法可以更新每个 Bullet 或我做错了什么?
Bullets = {}
Bullets.__index = Bullets
function Bullets.new()
local this = {}
this.x = Player.x
this.remove = false
this.dir = math.random(1,2)
this.timer = 0
this.velocity = math.random(2,5)
if this.dir == 1 then
this.y = display.actualContentHeight
elseif this.dir == 2 then
this.y = 0
end
this.rect = display.newRect(this.x,this.y,math.random(5,10),math.random(5,10))
this.rect:setFillColor(0)
return setmetatable(this,Bullets)
end
function Bullets.update(self,event)
self:move()
end
function Bullets.move(self)
if self.dir == 1 then
self.y = self.y + self.velocity
elseif self.dir == 2 then
self.y = self.y - self.velocity
end
end
function Bullets.destroy(self)
self.remove = true
end
Bullets.enterFrame = Bullets.update
Runtime:addEventListener("enterFrame",Bullets)
timer.performWithDelay(500,Bullets.new,0)
在 LÖVE 中,我可以使用以下方式更新每个单独的 Bullet:
function love.update(dt)
for _,v in ipairs(Bullets) do v:update(dt) end
end
根据你在 Love 中使用的循环,我会让 Bullets
成为一个 Bullet
的数组,你的更新函数应该像你在 Love 中那样循环。所以你需要一些修复:
1) 将您发布的代码中的所有地方 Bullets
更改为 Bullet
2) 替换这些行
Bullets.enterFrame = Bullets.update
Runtime:addEventListener("enterFrame",Bullets)
timer.performWithDelay(500,Bullets.new,0)
和
lastTime = 0
function updateBullets(event)
local dt = lastTime - event.time
lastTime = event.time
for _,v in ipairs(Bullets) do v:update(dt) end
end
Runtime:addEventListener("enterFrame",updateBullets)
timer.performWithDelay(500,Bullet.new,0)
3) 使 new()
添加新项目符号到 Bullets
列表:
function Bullet.new()
local this = {}
table.insert(Bullets, this)
... rest is same...
end
4)(可能,见后注)使子弹在被摧毁时从子弹列表中删除:
function Bullet.destroy(self)
self.remove = true
remove = find_bullet_in_bullets_list(self)
table.remove(Bullets, remove)
end
根据您对 self.remove = true
的使用,可能不需要最后一步 4 我猜您对 "marking for deletion" 和 "actually delete" 有不同的阶段,但您得到了主意。