【问题标题】:Attempt to index global 'head' (a nil value) love2d尝试索引全局“头部”(零值)love2d
【发布时间】:2015-11-21 01:07:08
【问题描述】:

我正在通过一个简单的蛇游戏来试验 lua,但我不断收到这个错误,我被困住了。

代码:

function love.load()

    width, height = love.window.getDimensions()
    start= {x= width/2, y = height/2}

    snake = {}
    snake.dir = 0
    snake.speed = 300
    snake.body  = {}


    for i = 0, 5, 1 do
        table.insert(snake.body,{x=start.x,y=start.y + i })
    end

end

function love.keypressed(key)

    if key == "left" and snake.dir ~= 1 then 
        snake.dir = 0
    end
    if key == "right" and snake.dir ~= 0 then
        snake.dir = 1
    end 
    if key == "up" and snake.dir ~= 3 then
        snake.dir = 2
    end
    if key == "down" and snake.dir ~= 2 then
        snake.dir = 3
    end

end 

function love.update(dt)

    head = snake.body[0]

    if snake.dir == 0 then
        head = {head.x - snake.speed*dt, head.y}
    end

    if snake.dir == 1 then
        head = {head.x + snake.speed*dt, head.y}
    end

    if snake.dir == 2 then
        head = {head.x, head.y - snake.speed*dt}
    end

    if snake.dir == 3 then
        head = {head.x, head.y + snake.speed*dt}
    end 

    table.insert(snake.body,0,head)
    table.remove(snake.body,#snake.body)

end

function love.draw()


end

错误是在函数更新中。

另外,我将如何遍历每个蛇的部分?就像 lua 中的 foreach 等价物是什么?感谢您的帮助

【问题讨论】:

  • Lua 表索引是从 1 开始的。在这些行中将最小索引从 0 更改为 1:for i = 0, 5, 1 dohead = snake.body[0]table.insert(snake.body,0,head)
  • 也将head = {head.x - snake.speed*dt, head.y}改为head = {x = head.x - snake.speed*dt, y = head.y}

标签: lua love2d


【解决方案1】:

Lua 中的表(数组)是 1-indexed 而不是 0-indexed。所以数组中的第一项应该是 1 而不是 0。

定义蛇身时,从 1 开始,而不是 0:

for i = 1, 5 do
    table.insert(snake.body,{x=start.x,y=start.y + i })
end

然后在您的更新处理程序中:

head = snake.body[1]

要遍历数组,您可以将 ipairs 用于数字索引或将 pair 用于命名键:http://lua-users.org/wiki/ForTutorial

例如,假设snake.body 是一个数字引用列表,您可以这样做:

for key, value in ipairs(snake.body) do
   ...
end

要迭代 snake 上的所有内容,您可以这样做:

for key, value in pairs(snake) do
   ...
end

另外,对于您的keypressed 处理程序,使用查找表不是更干净吗?

local keyToDir = { left = 0, right = 1, up = 2, down = 3 }

function love.keypressed(key)
   local dir = keyToDir[key];
   if dir then snake.dir = dir end;
end

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2013-06-07
    • 2020-03-08
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2017-01-10
    相关资源
    最近更新 更多