Попытка LUA индексировать глобальное значение nil - PullRequest
0 голосов
/ 25 сентября 2018

Я прочитал другие ответы с таким же названием, но безрезультатно.Моя проблема выглядит простой, но я не могу найти способ справиться с этим.Просто начал LUA несколько дней назад.Здесь он печатает «nam», поэтому происходит столкновение.Однако display.remove (apple) не работает.А removeSelf () выдает ошибку, которая говорит: «попытка проиндексировать глобальное« яблоко »(нулевое значение)».Единственное, что я хочу, чтобы произошло с яблоком при столкновении, это чтобы оно исчезло.

function appleCollision(self, event)
  if event.phase == "began" then
    print("nam")
    --display.remove( apple )
    apple:removeSelf()
    apple = nil
  end
end


local apple = display.newImageRect( "apple.png", 65, 85 )
apple.x, apple.y = 460, -100
apple.rotation = 15
apple:addEventListener ( "collision", apple )
apple.collision = appleCollision
physics.addBody( apple, { density=1.0, friction=0.3, bounce=0.3 } )

1 Ответ

0 голосов
/ 25 сентября 2018

Полагаю, это будет многочастный ответ ...

Лексическая область видимости

Типичный пример:

do
  local foo = 20
  function bar() return foo end
end
print(tostring(foo)) -- prints "nil", foo is out of scope
print(bar()) -- prints 20, bar still knows about foo

В вашем случае все наоборот

function bar() return foo end
-- foo does not exist as a local yet, so Lua tries accessing a global foo
do
  local foo = 20
  print(tostring(bar())) -- prints nil because bar doesn't know foo
end -- forget about local foo
foo = 30 -- global
local foo = 20
print(bar()) -- prints 30, because it doesn't know the local foo

Ваша проблема

Это в основном то, что происходит в вашем примере.Вы объявляете переменную player после функции, поэтому к моменту объявления функции не существует локальной переменной player, поэтому она компилирует функцию, которая обращается к глобальной переменной player.Так как этот глобал не существует, он рассматривается как ноль, и когда вы пытаетесь проиндексировать его, Луа жалуется.

Исправления

  • Либо удалите local и сделайте player aглобальная переменная (это легко сделать, но глобальные переменные - это дьявол, и вы не должны использовать их легкомысленно)
  • Или объявите ее с помощью local player над функцией, затем вы можете присвоить ей значение ниже.

Обратите внимание, что функция будет сохранять переменную , а не ее значение при создании функции.Вот пример того, что я имею в виду:

local foo = 20
function bar() return foo end
foo = 30
print(bar()) -- prints 30, not 20

Это нечто большее, но это все, что вам нужно знать, чтобы решить вашу проблему.Если вы хотите узнать больше, просто поищите лексику в lua, и вы наверняка найдете объяснения лучше, чем я когда-либо мог бы дать вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...