You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:55:35