2016-11-06 8 views
0

Я совершенно не знаком с Короной (Lua). После запуска игры, игра, кажется, не работает отлично, пока через несколько секунд, когда я получаю следующее сообщение об ошибке: «Попытка сравнить ноль с номером»Попытка сравнить nil с номером Ошибка в Lua (Corona Lab)

локальной функцией gameLoop()

-- create new asteroids 
createAsteroid() 

-- remove asteroids which have been drifted off the screen 
for i = #asteroidsTable, 1, -1 do 
    local thisAsteroid = asteroidsTable [i] 

    if (thisAsteroid.x < -100 or 
     thisAsteroid.x > display.contentWidth + 100 or 
     thisAsteroid.y < -100 or 
     thisAsteroid.y > display.contentHeight + 100) 

    then 

     display.remove(thisAsteroid) 
     table.remove(asteroidsTable) 

    end 

end 

концом


как видно выше, «thisAsteroid» находится в «asteroidsTable = {}», который определяется как переменная в верхней части модуля, так и вне любой функции.

местного asteroidsTable = {}

Спасибо за вашу помощь!

+0

Попробуйте использовать выражения 'print' перед строкой, где встречается ошибка. – hjpotter92

+0

не могли бы вы быть более конкретными и привести пример заявления о печати? (извините, я новичок в кодировании) – EbrahimB

ответ

0

Либо thisAsteroid.x, thisAsteroid.y, display.contentWidth или display.contentHeight is nil.

использование print(thisAsteroid.x) и т.п. чтобы узнать, какой из nil.

Вы также должны получить номер строки с сообщением об ошибке, которое поможет вам найти проблему.

После того, как вы нашли значение nil, вы должны либо не допустить его превращения в nil, либо если вы не можете сделать это, вы должны ограничить свое сравнение не-nil значениями.

0

Попробуйте

-- create new asteroids 
createAsteroid() 

-- remove asteroids which have been drifted off the screen 
for i = #asteroidsTable, 1, -1 do 
    local asteroid = asteroidsTable [i] 

    if (asteroid.x < -100 or 
     asteroid.x > display.contentWidth + 100 or 
     asteroid.y < -100 or 
     asteroid.y > display.contentHeight + 100) 

    then 
     local asteroidToRemove = table.remove(asteroidsTable, i) 
     if asteroidToRemove ~= nil then 
      display.remove(asteroidToRemove) 
      asteroidToRemove= nil 
     end 
    end 
end 
end 

От lua.org documentation

table.remove (list [, pos])

Removes from list the element at position pos, returning the value of the removed element. When pos is an integer between 1 and #list, it shifts down the elements list[pos+1], list[pos+2], ···, list[#list] and erases element list[#list]; The index pos can also be 0 when #list is 0, or #list + 1; in those cases, the function erases the element list[pos].

The default value for pos is #list, so that a call table.remove(l) removes the last element of list l

Так с инструкцией table.remove(asteroidsTable) удалить последний элемент из таблицы asteroidsTable но вы должны удалить I-й элемент.

Подробнее об удалении элементов из таблицы из Corona forum.