Сбой Love2d при выходе, если после создания холста размер окна был изменен

Моя проблема в том, что, когда вы изменяете размер окна, выходите нажатием клавиши в консоли, love.exe вылетает. Это происходит только тогда, когда используется холст. Вот как воспроизвести аварию:

  • Запустите файл.love
  • Подождите, пока круг завершится и окно закроется
  • Нажмите любую клавишу, затем следует выполнить love.exe.

Это не будет работать, если вы только запустите код, потому что консоль должна быть включена в conf.lua, поэтому, пожалуйста, запустите файл love. Если размер окна не изменен, сбой не произойдет.

авария

function draw()
   love.graphics.circle("fill", 100, 100, 50)  -- Draw circle
   love.graphics.setColor(255, 255, 255, 255)
   love.graphics.setCanvas()
   love.graphics.draw(canvas, 0, 0, 0, 2)  -- 200% zoom
   love.graphics.setCanvas(canvas)
   love.graphics.present()  -- Refresh screen
end

love.window.setMode(500, 500)
canvas = love.graphics.newCanvas(1000, 1000)  -- Create canvas
love.graphics.setCanvas(canvas)
draw()  -- Draw circle
love.timer.sleep(1)

love.window.setMode(800, 800)  -- Resize window
love.graphics.setCanvas(canvas)
draw()  -- Redraw circle

love.timer.sleep(2)
love.window.close()
print("Should crash when you quit this by pressing key")
os.execute("pause")
love.event.push("quit")

Без падений

function draw()
   love.graphics.circle("fill", 100, 100, 50)  -- Draw circle
   love.graphics.setColor(255, 255, 255, 255)
   love.graphics.setCanvas()
   love.graphics.draw(canvas, 0, 0, 0, 2)  -- 200% zoom
   love.graphics.setCanvas(canvas)
   love.graphics.present()  -- Refresh screen
end

love.window.setMode(500, 500)

canvas = love.graphics.newCanvas(1000, 1000)  -- Create canvas
love.graphics.setCanvas(canvas)
draw()  -- Draw circle
love.timer.sleep(1)

-- Window was resized once, before canvas creation --> no crash

love.window.close()
os.execute("pause")
love.event.push("quit")

Скачать.love файл

Обратите внимание, что я также разместил эту проблему на форумах LOVE здесь, но пока нет хороших ответов. Я думал, может быть, я мог бы получить ответ здесь.

1 ответ

Решение

Согласно документации setMode:

Изменение режима отображения может иметь побочные эффекты: например, холсты будут очищены, а значения, отправленные в шейдеры с помощью Shader:send, будут удалены. Обязательно сохраните содержимое холстов заранее или повторно перетяните их позже, если вам нужно.

Вы можете сохранить данные холста и предотвратить сбой, сбросив цель рендеринга в качестве основного экрана во время операции setMode:

love.graphics.setCanvas() -- Reset render target to screen
love.window.setMode(800, 800)  -- Resize window
love.graphics.setCanvas(canvas) -- Render to canvas again

НТН,

Xeozim

Другие вопросы по тегам