我正在使用电晕sdk进行射击游戏...... 我的问题是,当我离开屏幕时,我试图删除一个对象(它是数组的一部分)...当我这样做时,我得到一个错误,上面写着'试图将nil值与变量进行比较',这是指一个简单的移动数组中每个对象的函数。以下是代码的相关部分:
function addAlien()
listeners('add')
end
function listeners(action)
if(action == 'add') then
Runtime:addEventListener('enterFrame',update)
enemyTimer = timer.performWithDelay(800,addEnemy,0)
else
Runtime:removeEventListener('enterFrame',update)
timer.cancel(enemyTimer)
end
end
function addEnemy(e)
enemy = display.newImage('drone.png')
enemy.x = 500
enemy.y = math.floor(math.random()*300)
enemy:scale(-0.1,0.1)
enemy.speed = math.random(2,6)
enemies.insert(enemies,enemy)
enemy.enterFrame = moveEnemy
Runtime:addEventListener('enterFrame',enemy)
end
function moveEnemy(self,event)
--if self.x < 100 then
---self:removeSelf()
--self = nil
--removeSelf()
--else
self.x = self.x-self.speed
--end
end
function update(e)
if(enemies.numChildren ~= 0)then
for i = 1,enemies.numChildren do
if(enemies[i] ~= nil)then
--enemies[i].x = enemies[i].x-3
if(enemies[i].x<100)then
--enemies:remove(enemies[i])
--display.remove(enemies[i])
--enemies[i] = nil
end
end
end
end
end
我已经注释掉了给我错误的部分。 任何帮助将不胜感激,
感谢
答案 0 :(得分:1)
您可能想尝试将删除代码放入其自己的函数中,然后使用计时器将其删除,以便您当前正在删除对象的函数可以返回,而您不会自行删除。
另一个选择是让它暂时不可见,然后定期循环遍历表并删除移动处理程序之外的任何内容。
答案 1 :(得分:0)
您遇到以下问题:
function listeners(action)
if(action == 'add') then
Runtime:addEventListener('enterFrame',update)
enemyTimer = timer.performWithDelay(800,addEnemy,0)
else
Runtime:removeEventListener('enterFrame',update)
timer.cancel(enemyTimer)
end
end
你只想要运行时:addEventListener('enterFrame',update)一次。如果你每次添加敌人时都会出现问题。问题是您的代码在已经删除对象后反复运行。
答案 2 :(得分:0)
嗯。你使用场景模板了吗?如果是这样,你应该只在底部的场景破坏部分中放入:removeself()和= nil值。你也不需要第二个删除自己没有附加到一个对象,因为这可能是零问题。
总结一下。 1-put all在场景模板的destroy部分删除self()和= nil,然后使用object.isVisible = false。 2 -nil错误很可能来自没有对象的removeself()语句。所以将它改为moveenemy:removeself()
答案 3 :(得分:0)
如果我的理解是对的,这就是我如何在不使用运行时的情况下做到这一点 并使用计时器代替。如果您有疑问,请随时联系
local scrWidth = display.actualContentWidth
local scrHeight = display.actualContentHeight
local enemy = {} --this will hold your aliens
function addEnemy()
enemy[#enemy + 1] = display.newImage("drone.png")
enemy[#enemy].x = 500
enemy[#enemy].y = math.floor(math.random()*300)
enemy[#enemy]:scale(-0.1,0.1)
enemy[#enemy].speed = math.random(2,6)
end
local function update()
addEnemy()
--this will move the enemy to the left from right
for i=1,#enemy,1 do
enemy[i].x = enemy[i].x - enemy[i].speed
end
--the below codes will destroy each enemy that is out side the screen on the left
local function destroyWhenOutside()
for i=1,#enemy,1 do
if enemy[i].x < 0 - enemy[i].width then
enemy[i]:removeSelf()
enemy[i] = nil
elseif enemy[i].y < 0 - enemy[i].height then
enemy[i]:removeSelf()
enemy[i] = nil
end
end
end
destroyWhenOutside()
end
--this will loop the update every 1/1000 seconds
local timerUpdate = timer.performWithDelay(1,update,-1)