【问题标题】:Corona SDK 'nil value' issueCorona SDK“零值”问题
【发布时间】:2017-07-26 01:01:45
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,问题不在于我在删除自己,因为在敌人离开屏幕后被删除后,moveEnemy 函数不会引用任何内容,即使我只从数组中删除那个特定的敌人。 ..并且每当创建敌人时都会添加 moveEnemy 的事件侦听器
    【解决方案2】:

    以下代码有问题:

    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) 一次。如果每次添加敌人时都这样做,那么事情就会出错。问题是您的代码在对象已被删除后一次又一次地运行。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果我的理解是正确的,我会在不使用运行时的情况下这样做 并改用计时器。有问题就问吧

        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)
        

        .

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-26
          • 2015-06-25
          • 1970-01-01
          相关资源
          最近更新 更多