尝试将 player 调用为表值

我正在编写我的第一个 love2d lua 脚本,我不确定为什么会出现错误“main.lua:4 attempting to call global 'Player' a table value”。 我的两个脚本如下:

--Main.lua

require("player")
function love.load()
  p = Player()
end

function love.update(dt)
  p:update(dt)
end

function love.draw()
  p:draw()
end

--Player.lua

Player = {}
--variables for the player (size, position, speed)

function Player:new()
  o = {
    x = 30,
    y = 30,
    w = 20,
    h = 20,
    speed = 300,
  }
  setmetatable(player, { __index = Player })
end

function Player:update(dt)
  if love.keyboard.isDown("a") then
    player.x = player.x - player.speed * dt
  end
  if love.keyboard.isDown("d") then
    player.x = player.x + player.speed * dt
  end
  if love.keyboard.isDown("w") then
    player.y = player.y + player.speed * dt
  end
  if love.keyboard.isDown("s") then
    player.y = player.y - player.speed * dt
  end
end

function Player:draw()
  love.graphics.rectangle("fill", o.x, o.y, o.w, os.h)
end
点赞
用户5675002
用户5675002

你有一个 Player 表,实现了某个类。这是一个表,你不能这样调用它 p = Player()。应该调用 new() 方法:

function love.load()
  p = Player:new()
end

此外,似乎 new() 中存在一些错误。你声明了一个全局的 o 变量(应该是局部的),并返回的是 player 而不是 o,而且根本没有 player。像这样修复它:

function Player:new()
  local o = {
    x = 30,
    y = 30,
    w = 20,
    h = 20,
    speed = 300,
  }
  return setmetatable(o, { __index = Player })
end
2017-05-14 09:30:24
用户5219197
用户5219197

尽量避免在 player.lua 中使用全局变量,这会引起麻烦。

这里是可行的方法:

main.lua

local player = require("player")

function love.load()
  p = player:new()
end

function love.update(dt)
  p:update(dt)
end

function love.draw()
  p:draw()
end

player.lua

 local Player = {}

function Player:new()
  local player = {
    x = 30,
    y = 30,
    w = 20,
    h = 20,
    speed = 300,
    }
  self.__index = self
  return setmetatable(player, self)
end

function Player:update(dt)
  if love.keyboard.isDown("a") then
    self.x = self.x - self.speed * dt
  end
  if love.keyboard.isDown("d") then
    self.x = self.x + self.speed * dt
    end
  if love.keyboard.isDown("w") then
    self.y = self.y + self.speed * dt
    end
  if love.keyboard.isDown("s") then
    self.y = self.y - self.speed * dt
    end
  end

function Player:draw()
  love.graphics.rectangle("fill", self.x, self.y, self.w, self.h)
end

return Player
2017-05-14 15:07:48