[英]Lua Error "Attempt to call method '' (a nil Value)
我想制作一個2D平台(帶有Love2D-Framework),並有一個main.lua文件從狀態文件夾中選擇隨機映射。 首先,我只是說main-main.lua應該在/ states / map1 /中打開main.lua文件。 但是每次我嘗試運行它時,我都會收到以下錯誤消息:
錯誤
States / map1 / main.lua:169:嘗試調用方法“ update”(一個nil值)
追溯
States / map1 / main.lua:169:在函數“ update”中[C]:在函數“ xpcall”中
main-main.lua代碼:
function clearLoveCallbacks()
love.draw = nil
love.joystickpressed = nil
love.joystickreleased = nil
love.keypressed = nil
love.keyreleased = nil
--love.load = nil
love.mousepressed = nil
love.mousereleased = nil
love.update = nil
end
state = {}
function loadState(name)
state = {}
clearLoveCallbacks()
local path = "states/" .. name
require(path .. "/main")
load()
local player
end
function load()
end
function love.load()
loadState("map1")
end
/ states / map1 /-文件中的main.lua:
player = table
local AdvTiledLoader = require("AdvTiledLoader.Loader")
require("camera")
function love.load()
love.graphics.setBackgroundColor( 198, 220, 255 )
song1 = love.audio.newSource("sound/Brightly_Fancy.mp3", true)
song1:setVolume(0.1)
song1:play()
imgPlayer = love.graphics.newImage("textures/player.png")
AdvTiledLoader.path = "maps/"
map = AdvTiledLoader.load("map1.tmx")
map:setDrawRange(0, 0, map.width * map.tileWidth, map.height * map.tileHeight)
camera:setBounds(0, 0, map.width * map.tileWidth - love.graphics.getWidth(), map.height * map.tileHeight - love.graphics.getHeight() )
world = {
gravity = 1536, --1536
ground = 512,
}
player = {
x = 256,
y = 256,
x_vel = 0,
y_vel = 0,
jump_vel = -1024,
speed = 512, --512
flySpeed = 700,
state = "",
h = 32,
w = 32,
standing = false,
}
function player:jump()
if self.standing then
self.y_vel = self.jump_vel
self.standing = false
end
end
function player:right()
self.x_vel = self.speed
end
function player:left()
self.x_vel = -1 * (self.speed)
end
function player:stop()
self.x_vel = 0
end
function player:collide(event)
if event == "floor" then
self.y_vel = 0
self.standing = true
end
if event == "cieling" then
self.y_vel = 0
end
end
function player:update(dt)
local halfX = self.w / 2
local halfY = self.h / 2
self.y_vel = self.y_vel + (world.gravity * dt)
self.x_vel = math.clamp(self.x_vel, -self.speed, self.speed)
self.y_vel = math.clamp(self.y_vel, -self.flySpeed, self.flySpeed)
local nextY = self.y + (self.y_vel*dt)
if self.y_vel < 0 then
if not (self:isColliding(map, self.x - halfX, nextY - halfY))
and not (self:isColliding(map, self.x + halfX - 1, nextY - halfY)) then
self.y = nextY
self.standing = false
else
self.y = nextY + map.tileHeight - ((nextY - halfY) % map.tileHeight)
self:collide("cieling")
end
end
if self.y_vel > 0 then
if not (self:isColliding(map, self.x-halfX, nextY + halfY))
and not(self:isColliding(map, self.x + halfX - 1, nextY + halfY)) then
self.y = nextY
self.standing = false
else
self.y = nextY - ((nextY + halfY) % map.tileHeight)
self:collide("floor")
end
end
local nextX = self.x + (self.x_vel * dt)
if self.x_vel > 0 then
if not(self:isColliding(map, nextX + halfX, self.y - halfY))
and not(self:isColliding(map, nextX + halfX, self.y + halfY - 1)) then
self.x = nextX
else
self.x = nextX - ((nextX + halfX) % map.tileWidth)
end
elseif self.x_vel < 0 then
if not(self:isColliding(map, nextX - halfX, self.y - halfY))
and not(self:isColliding(map, nextX - halfX, self.y + halfY - 1)) then
self.x = nextX
else
self.x = nextX + map.tileWidth - ((nextX - halfX) % map.tileWidth)
end
end
self.state = self:getState()
end
function player:isColliding(map, x, y)
local layer = map.tl["Solid"]
local tileX, tileY = math.floor(x / map.tileWidth), math.floor(y / map.tileHeight)
local tile = layer.tileData(tileX, tileY)
return not(tile == nil)
end
function player:getState()
local tempState = ""
if self.standing then
if self.x_vel > 0 then
tempState = "right"
elseif self.x_vel < 0 then
tempState = "left"
else
tampState = "stand"
end
end
if self.y_vel > 0 then
tempState = "fall"
elseif self.y_vel < 0 then
tempState = "jump"
end
return tempState
end
end
function love.draw()
camera:set()
love.graphics.setColor( 255, 255, 255, 255 )
love.graphics.draw( imgPlayer, player.x - player.w/2, player.y - player.h/2, 0, 1, 1, 0, 0)
love.graphics.setColor( 255, 255, 255 )
map:draw()
camera:unset()
end
function love.update(dt)
if dt > 0.05 then
dt = 0.05
end
if love.keyboard.isDown("d") then
player:right()
end
if love.keyboard.isDown("a") then
player:left()
end
if love.keyboard.isDown("w") then --and not (hasJumped) then
player:jump()
end
player:update(dt)
camera:setPosition( player.x - (love.graphics.getWidth()/2), player.y - (love.graphics.getHeight()/2))
end
function love.keyreleased(key)
if (key == "a") or (key == "d") then
player.x_vel = 0
end
end
我真的不知道問題出在哪里:/
您的代碼將無法以您認為的方式工作。 您調用love.load
,然后加載設置其自己的love.load
和love.update
地圖特定文件。 這將覆蓋您之前的love.load
,但是該更改沒有效果,因為love.load
僅被調用一次,因此您所擁有的地圖特定的初始化不會執行,但是地圖特定的love.update
代碼會執行,但是失敗因為它缺少初始化部分。 您需要重組代碼,以便只有一個love.load
和love.update
,但是它們會根據需要調用特定於地圖的函數。 我建議您看一些love2d游戲的示例,以了解它們的組織方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.