Corona SDK'无价值'问题

时间:2013-08-11 19:03:02

标签: lua corona

我正在使用电晕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

我已经注释掉了给我错误的部分。 任何帮助将不胜感激,

感谢

4 个答案:

答案 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)