我的范围不正确吗?

时间:2014-03-15 15:21:37

标签: lua scope love2d

所以我用Love2D制作游戏,我收到以下错误:

maps/map_one.lua:249: attempt to index field 'player' (a nil value)
Traceback
maps/map_one.lua:249: in function 'updateWorld'
main.lua:53: in function 'update'

所以,当我看一下我的player

function love.load()
    ....
    objects = {}
    objects.player = {} --obviously not nil
    objects.player.body = love.physics.newBody(world, 32, 32, "dynamic")
    ...
end

并且错误在哪里,

function updateWorld(dt)
    world:update(dt) --calculates physics and whatnot
    ....
    --line with error
    camera:setPosition(objects.player.body:getX() - (love.graphics.getWidth() / 2),
        objects.player.body:getY() - (love.graphics.getHeight() / 2))
end

然后我看了main.lua

require("maps.map_one") --file with error
....
function love.update(dt)
    updateWorld(dt) --updateWorld() in map_one.lua
end

我看不出任何错误。

如果有帮助,我正在使用Love2D v.9.0.0以及任何版本的Lua附带它(独立)。

1 个答案:

答案 0 :(得分:1)

objects.player最初不是nil,但在某些update()期间它是nil所以有些东西是nilling它。我从来没有使用过Love2D,但是love.update(dt)需要一个时间步,所以假设在每个时间帧调用此函数,你可以尝试打印objects.player并查看它何时变为零:

function love.update(dt)
    print("objects.player:", objects.player)
    updateWorld(dt) --updateWorld() in map_one.lua
end

如果你看到objects.player不是nil的某些打印,那么它就变为nil,你知道其他一些更新函数(可能是一个事件处理程序)正在对它做一些事情。如果在第一次更新时它是零,则可能代码在初始化期间执行某些操作,在love.load()中列出的行之后。你应该在该函数的末尾print("objects.player:", objects.player),只是为了确保它在返回时不是nil。