尝试索引全局 'head'(零值)love2d
Attempt to index global 'head' (a nil value) love2d
我正在通过一个简单的贪吃蛇游戏 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 而不是 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 作为数字索引或使用 pairs 作为命名键: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
处理程序,使用查找 table 不是更干净吗?
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
我正在通过一个简单的贪吃蛇游戏 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 而不是 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 作为数字索引或使用 pairs 作为命名键: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
处理程序,使用查找 table 不是更干净吗?
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