0

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

4 回答 4

1

您可能想尝试将删除代码放入它自己的函数中,然后使用计时器将其删除,以便您当前删除对象的函数可以返回,而您不会删除自己。

另一种选择是使其暂时不可见,然后定期循环遍历表并删除移动处理程序之外的任何内容。

于 2013-08-12T02:24:44.677 回答
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

您只想 Runtime:addEventListener('enterFrame', update) 一次。如果每次添加敌人时都这样做,那么事情就会出错。问题是您的代码在已经删除对象后一次又一次地运行。

于 2014-04-08T19:21:52.257 回答
0

嗯。你用场景模板了吗?如果是这样,您应该只将 :removeself () 和 = nil 值放在底部的场景销毁部分中。您也不需要第二个未附加到对象的 removeself ,因为这可能是 nil 问题。

总结。1-将所有删除 self () 和 = nil 放在场景模板的销毁部分,并使用 object.isVisible = false 代替。2-nil 错误很可能来自没有对象的 removeself() 语句。所以把它改成 moveenemy:removeself ()

于 2017-07-25T02:07:33.380 回答
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)

.

于 2017-07-25T17:01:45.650 回答