爱2d。状态系统不会第二次加载游戏状态

Love2d. States system won't load the game state a second time

我正在学习 lua 和 love2d,我正在尝试制作一个示例游戏以熟悉它。我正在关注 goature 在 youtube 上的教程,并使用他的状态系统来导航游戏。我完成了菜单示例代码的编写,并决定我希望能够从游戏中返回菜单。问题是游戏不会第二次加载游戏状态,而是给我一个灰色的屏幕。这应该是相关代码。

来自根文件main.lua

function clearLoveCallbacks()
    love.draw = nil
    love.joystickpressed = nil
    love.joystickreleased = nil
    love.keypressed = nil
    love.keyrelease = nil
    love.load = nil
    love.mousepressed = nil
    love.mousereleased = nil
    love.update = nil
end

states = {}
function loadState(name)
    states = {}
    clearLoveCallbacks()
    local path = "states/" .. name
    require(path .. "/main")
    load()
end

function load()
end

function love.load()
    loadState("menu")

end

从菜单中main.lua

function load()

    love.graphics.setBackgroundColor(190, 190, 190, 255)

    imgPlay = love.graphics.newImage("Textures/start.png")
    imgPlayOn = love.graphics.newImage("Textures/start_on.png")
    imgexit = love.graphics.newImage("Textures/exit.png")
    imgexitOn = love.graphics.newImage("Textures/exit_on.png")

    buttons = {
              {imgOff = imgPlay, imgOn = imgPlayOn, x = 400, y = 300 - 64, w = 256, h = 64, action = "play"},
              {imgOff = imgexit, imgOn = imgexitOn, x = 400, y = 300 + 64, w = 256, h = 64, action ="exit"}
              }
end
function love.mousepressed(x, y, button)
    if button == 1 then
        for k,v in pairs(buttons) do
            local ins = insideBox(x, y, v.x - (v.w/2), v.y - (v.h/2), v.w, v.h) -- must use v. for the rest of the arguments except the first 2 because that x and y defined in arguments of the function

            if ins then
                if v.action == "play" then
                    loadState("New_Game") -- loads new game for some reason if i load the menu state from game it won't load the game a secound time
                elseif v.action == "exit" then
                    love.event.quit() -- love2d function to quit
                end
            end
        end
    end
end

并且来自 New_Game main.lua

function load()
    require("States/New_Game/entities")
    love.graphics.setBackgroundColor(255,255,255,255)
    ents.startup()
    --local newEnt= ents.Create("new_ent", 128, 128)
    ents.Create("enemy_base", -math.random(128, 256), 128)
end
function love.keypressed(key, unicode)
    if love.keyboard.isDown("escape") then
        loadState("Menu")
    end
end

您所提供的代码,如所写,无法完成您似乎想要的。

您似乎希望能够调用 loadState,并且您希望此函数将内容加载到有效设置新 "state".

的全局变量中

嗯,这可能没问题...除了您使用 require 进行加载。而且,除非 Love2D 改变了函数的工作方式,require 只会加载特定脚本 一次

看,是脚本本身的执行改变了状态。它定义了一个全局 load 函数,您可以调用它。它在 love table 中定义了一些其他函数。等等。

但这只会在加载并执行脚本时发生。如前所述,require 只会在 第一次 您需要新模块时执行此操作。

想必,你想要的是dofile,而不是require。但老实说,我建议 re-architecting 您的系统不要依赖全局变量。注册您想要的状态 up-front,但不要让它们设置全局值。相反,让每个状态定义一个包含其 load 函数的 table。 load 函数应该注册它的 Love2D 回调。

您的 "states" 看起来更像这样:

local ret = {}

--Executed only once.
local imgPlay = love.graphics.newImage("Textures/start.png")
local imgPlayOn = love.graphics.newImage("Textures/start_on.png")
local imgexit = love.graphics.newImage("Textures/exit.png")
local imgexitOn = love.graphics.newImage("Textures/exit_on.png")

local buttons =
{
    {imgOff = imgPlay, imgOn = imgPlayOn, x = 400, y = 300 - 64, w = 256, h = 64, action = "play"},
    {imgOff = imgexit, imgOn = imgexitOn, x = 400, y = 300 + 64, w = 256, h = 64, action ="exit"}
}

local function mousepressed(x, y, button)
    if button == 1 then
        for k,v in pairs(buttons) do
            local ins = insideBox(x, y, v.x - (v.w/2), v.y - (v.h/2), v.w, v.h) -- must use v. for the rest of the arguments except the first 2 because that x and y defined in arguments of the function

            if ins then
                if v.action == "play" then
                    loadState("New_Game") -- loads new game for some reason if i load the menu state from game it won't load the game a secound time
                elseif v.action == "exit" then
                    love.event.quit() -- love2d function to quit
                end
            end
        end
    end
end

function ret.load()
    --Actual state setup.
    love.mousepressed = mousepressed

    love.graphics.setBackgroundColor(190, 190, 190, 255)
end

return ret

您的 loadState 函数也需要更改:

function loadState(name)
    states = {}
    clearLoveCallbacks()
    local path = "states/" .. name
    local state = require(path .. "/main")
    state.load()
end

哦,我建议您放弃 "learning" 来自的任何教程。它在教你可怕的事情。它涉及 way 太多的全局使用,这就是导致这个问题的原因。如果你只是在学习 Lua,那么你正在学习使用 Lua 非常糟糕。