我读了其他标题相同但无济于事的答案。我的问题看起来很简单,但是我找不到解决方法。几天前才刚开始LUA。在这里,它打印“ nam”,所以有冲突。但是,display.remove(apple)不起作用。并且removeSelf()给出一个错误,指出“试图索引全局'apple'(nil值)”。我唯一想在碰撞时发生的事情就是让苹果消失。
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 } )
答案 0 :(得分:1)
我想这将是一个多方面的答案...
典型示例:
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
变量的函数。由于该全局不存在,因此将其视为nil,并且当您尝试对其进行索引时,Lua会抱怨。
local
,然后将player
设置为全局变量(容易做到,但是全局变量是魔鬼,您不应轻易使用它们)local player
进行声明,然后可以在其下方分配一个值。请注意,该函数将在创建函数时保存变量,而不是其值。这是我的意思的示例:
local foo = 20
function bar() return foo end
foo = 30
print(bar()) -- prints 30, not 20
还有更多的功能,但这是解决问题所需要了解的所有知识。如果您想了解更多信息,只需在google上搜索lua的词汇范围,您肯定会找到比我所能提供的更好的解释。