尝试在Lua中重置游戏

我在游戏开发和Lua方面非常新手。我正在制作一个平台游戏,并且希望能够在角色与某个对象发生碰撞时重新启动游戏,并在此之前显示一个标题。我还希望一旦发生这种情况,将角色的位置重置回0, 0,但我不知道如何实现。

我创建了一个名为WIN的全局变量,如果角色与对象发生碰撞,则该变量设为true,这很有效,但是进入我的love.draw()函数时,我有以下代码:

function love.draw()

-- 开始虚拟分辨率绘画
push:apply('start')

-- 使用Mario背景蓝色清除屏幕
love.graphics.clear(108/255140/255255/255255/255)

-- 在屏幕上呈现我们的地图对象
love.graphics.translate(math.floor(-map.camX + 0.5),math.floor(-map.camY + 0.5))
map:render()

if WIN == true then
    love.graphics.printf('下一关',0,30,VIRTUAL_WIDTH,'center')
    love.graphics.printf('继续下一关',045,VIRTUAL_WIDTH,'center')
    love.load()
end
-- 结束虚拟分辨率
push:apply('end')

当我实际与对象发生碰撞时,我会得到以下错误:

错误
push.lua:48:在love.graphics中使用Canvas时无法调用love.window.setMode。
追溯
[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()
-- 设置不同,外观更好的复古字体作为我们的默认值
    love.graphics.setFont(love.graphics.newFont('fonts/font.ttf', 8))

-- 为实现真正的复古感觉,设置虚拟屏幕分辨率
push:setupScreen(VIRTUAL_WIDTH,VIRTUAL_HEIGHT,WINDOW_WIDTH,WINDOW_HEIGHT,{
    fullscreen = false,
    resizable = true
})

love.window.setTitle('超级马里奥50')

love.keyboard.keysPressed = {}
love.keyboard.keysReleased = {}
end

我猜问题是我不能在已经执行一次屏幕设置后再次设置屏幕,但我不知道如何解决并重新开始。任何帮助都将不胜感激!

点赞
用户6331353
用户6331353

love.load() 只会运行一次。这一次是在游戏启动时。不要在 love.draw() 中调用 love.load()(或者反过来)。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() 中画出它们所在的坐标。

2020-08-11 21:29:21
用户11740758
用户11740758

使用以下命令来重新启动/重置游戏而不需要重新加载可执行文件:

love.event.quit('restart')

但在执行此操作之前,请在屏幕上创建一个黑色画面,并附上红色掉落的字母: GAME OVER

2020-08-18 12:03:06