尝试在 Lua 中重置游戏

Posted

技术标签:

【中文标题】尝试在 Lua 中重置游戏【英文标题】:Trying to Reset Game in Lua 【发布时间】:2020-12-01 14:10:19 【问题描述】:

这里对游戏开发和 Lua 非常陌生。我正在制作一个平台游戏,我希望能够在角色与某个物体发生碰撞后重新开始游戏,并在此之前显示一个标题。一旦发生这种情况,我也想将角色的位置重置回 0,0,但我不知道如何。

我创建了一个名为 WIN 的全局变量,如果角色与对象发生碰撞,则将其设置为 true,这有效,但随后进入我的 love.draw() 函数,我有这个:

function love.draw()

-- begin virtual resolution drawing
push:apply('start')

-- clear screen using Mario background blue
love.graphics.clear(108/255, 140/255, 255/255, 255/255)

-- renders our map object onto the screen
love.graphics.translate(math.floor(-map.camX + 0.5), math.floor(-map.camY + 0.5))
map:render()

if WIN == true then
    love.graphics.printf('NEXT LEVEL', 0, 30, VIRTUAL_WIDTH, 'center')
    love.graphics.printf('Continue to Next Level', 0, 45, VIRTUAL_WIDTH, 'center')
    love.load()
end
-- end virtual resolution
push:apply('end')

结束 当我实际与对象发生碰撞时,出现以下错误:

Error
push.lua:48: love.window.setMode cannot be called while a Canvas is active in love.graphics.
Traceback
[C]: in function 'windowUpdateMode'
push.lua:48: in function 'setupScreen'
main.lua:43: in function 'load'
main.lua:116: in function 'draw'
[C]: in function 'xpcall'

错误行在我的love.load()函数中,如下:

function love.load()
    -- sets up a different, better-looking retro font as our default
    love.graphics.setFont(love.graphics.newFont('fonts/font.ttf', 8))

-- sets up virtual screen resolution for an authentic retro feel
push:setupScreen(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, 
    fullscreen = false,
    resizable = true
)

love.window.setTitle('Super Mario 50')

love.keyboard.keysPressed = 
love.keyboard.keysReleased = 
end

我猜问题是我已经做了一次之后无法再次设置屏幕,但我不知道如何解决这个问题并重新开始。任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

love.load() 运行一次。那一次是你的游戏开始的时候。不要在love.draw() 内调用love.load()(或love.update()),反之亦然。 Love2D 游戏引擎会调用这些函数,因此您无需调用它们。

更新love.update() 而非love.draw() 中的起始位置。 love.draw() 仅用于绘图。我相信它会是model-view-controller 架构中的View

要重新定位对象的位置,您必须执行类似的操作

if WIN == true then
    push.x = push.start.x
    push.y = push.start.y
    map.camX = map.start.camX
    map.camY = map.start.camY
end

或者类似的东西,如果没有看到你的变量就很难知道。然后,您的 love.draw() 将在它们所在的坐标处绘制事物。

【讨论】:

我猜 push:applypush:end 也应该加入你的 love.update() 函数 非常感谢!我不想只是移动角色的位置,但我也想生成一张新地图。现在,它是随机执行的(我认为它被称为 procgen?),我想在角色与塔顶碰撞时制作一张新地图。有什么想法吗? 您必须执行类似map = map 的操作,或者创建一个新的地图对象【参考方案2】:

在不重新加载可执行文件的情况下重置/重新启动游戏:

love.event.quit('restart')

但在此之前先制作一个黑屏,然后用红色的字母:GAME OVER

【讨论】:

非常感谢!!我试试这个

以上是关于尝试在 Lua 中重置游戏的主要内容,如果未能解决你的问题,请参考以下文章

旧版本金庸群侠传3D新Unity重置修复版入门-lua”脚本“

重置游戏循环/重新启动游戏 java swing

在 Sprite Kit 游戏中重置 SKScene

重置游戏循环/重启游戏java swing

如何在发布前重置 Google Play 游戏排行榜?

如何重置微信小程序数据