Попытка сбросить игру в Lua

Очень новичок в разработке игр и 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')

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

Я предполагаю, что проблема в том, что я не могу снова настроить экран после того, как уже сделал это один раз, но я не знаю, как это исправить и начать все заново. Любая помощь приветствуется!


person Hana Ali    schedule 11.08.2020    source источник


Ответы (2)


love.load() запускается один раз. Это один раз, когда ваша игра запускается. Не звоните love.load() (или love.update()) в love.draw() или наоборот. Игровой движок Love2D вызывает эти функции, поэтому вы их не вызываете.

Обновите начальную позицию в пределах love.update(), а не love.draw(). love.draw() предназначен только для рисования. Я считаю, что это будет View в архитектуре model-view-controller.

Чтобы перезапустить положение вашего объекта, вам нужно будет сделать что-то вроде

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() затем нарисует предметы в тех координатах, в которых они находятся.

person Sam    schedule 11.08.2020
comment
Я предполагаю, что push:apply и push:end также должны войти в вашу love.update() функцию - person Sam; 12.08.2020
comment
Большое спасибо! Я не хочу просто перемещать позицию персонажа, но я также хочу создать новую карту. Прямо сейчас это происходит случайным образом (я думаю, это называется procgen?), И я хочу создать новую карту всякий раз, когда персонаж сталкивается с вершиной башни. Любые идеи? - person Hana Ali; 12.08.2020
comment
Вам нужно будет сделать что-то вроде map = map{} или, как бы то ни было, вы создадите новый объект карты - person Sam; 12.08.2020

Чтобы сбросить / перезапустить игру без перезагрузки исполняемого файла, используйте:

love.event.quit('restart')

Но перед этим сделайте темный экран с красными буквами: ИГРА ЗАВЕРШЕНА.

person koyaanisqatsi    schedule 18.08.2020
comment
Большое спасибо!! Я попробую это - person Hana Ali; 20.08.2020