在Love2D中调用外部脚本函数报错:attempt to index global 'player'
Love2D动作RPG开发报错:attempt to index global 'player' (a boolean value)
报错信息
Error main.lua:22: attempt to index global 'player' (a boolean value) Traceback main.lua:22: in function 'load' [C]: in function 'xpcall' [C]: in function 'xpcall'
项目代码
main.lua
-- RPG PROJECT IN LOVE2D -- debug mode debug = true -- SET FALSE BEFORE SHIPPING -- ROOM CHART: -- 0 - Title -- 1 - Overworld -- 2 - Shop -- 3 - Boss Room Room = 0 -- PLAYER STATE CHART: -- 0 - free -- 1 - attacking -- 3 - can't move function love.load(dt) player = require 'Scripts/player' player.load() sti = require 'Libraries/sti' gameMap = sti('Maps/overworld.lua') menuImg = love.graphics.newImage('Assets/Menu.png') love.window.setMode(800, 600) end function love.draw(dt) if Room == 0 then love.graphics.draw(menuImg, 0, 0) end if Room == 1 then gameMap:draw() player.draw() end if debug == true then love.graphics.print("Current FPS: "..tostring(love.timer.getFPS( )), 10, 10) end end function love.update(dt) if Room == 0 then if love.keyboard.isDown('space') then Room = 1 end end if Room == 1 then player.Update(dt) if love.keyboard.isDown('escape') then Room = 0 end end if love.keyboard.isDown('t') then debug = not debug end end
player.lua
-- PLAYER SCRIPT player = {x = 50, y = 50, speed = 3, state = 0, img = nil} function player.load() playerRight = love.graphics.newImage('Assets/playerRight.png') playerLeft = love.graphics.newImage('Assets/playerLeft.png') playerUp = love.graphics.newImage('Assets/playerUp.png') playerDown = love.graphics.newImage('Assets/playerDown.png') player.img = playerDown end function GetInput() if player.state == 0 or player.state == 1 then if love.keyboard.isDown('w') then player.y = player.y - player.speed player.img = playerUp elseif love.keyboard.isDown('s') then player.y = player.y + player.speed player.img = playerDown end if love.keyboard.isDown('a') then player.x = player.x - player.speed player.img = playerLeft elseif love.keyboard.isDown('d') then player.x = player.x + player.speed player.img = playerRight end end end function player.update(dt) GetInput() end function player.draw() love.graphics.draw(player.img, player.x, player.y) end
文件夹结构
项目根目录下包含以下子目录:
- Scripts:存放
player.lua - Libraries:存放sti库文件
- Maps:存放
overworld.lua地图文件 - Assets:存放游戏图片资源(含角色方向图、Menu.png)
问题原因及修复方案
1. 核心报错原因:require返回布尔值覆盖player表
Lua的require函数在模块没有显式返回值时,会返回true。你的player.lua没有在末尾返回player表,导致main.lua中player = require 'Scripts/player'把player变量赋值为true,后续调用player.load()时自然会报错(布尔值无法索引)。
修复:
在player.lua文件末尾添加return player,让require返回player表:
-- 在player.lua最后一行添加 return player
2. 大小写错误导致后续运行报错
main.lua的love.update中调用了player.Update(dt),但player.lua中定义的是小写开头的player.update(dt),这会导致切换到Overworld后报错。
修复:
将main.lua中的player.Update(dt)改为player.update(dt)。
3. 全局变量污染优化(可选)
当前playerRight、playerLeft等图片变量是全局变量,建议改为player表的成员,避免全局空间污染:
-- 修改player.load函数 function player.load() player.right = love.graphics.newImage('Assets/playerRight.png') player.left = love.graphics.newImage('Assets/playerLeft.png') player.up = love.graphics.newImage('Assets/playerUp.png') player.down = love.graphics.newImage('Assets/playerDown.png') player.img = player.down end -- 修改GetInput函数中的图片引用 function GetInput() if player.state == 0 or player.state == 1 then if love.keyboard.isDown('w') then player.y = player.y - player.speed player.img = player.up elseif love.keyboard.isDown('s') then player.y = player.y + player.speed player.img = player.down end if love.keyboard.isDown('a') then player.x = player.x - player.speed player.img = player.left elseif love.keyboard.isDown('d') then player.x = player.x + player.speed player.img = player.right end end end
内容的提问来源于stack exchange,提问作者CarSeatHeadrest_Lover
相关产品推荐
相关产品推荐

