Love2d:如何保留窗口内容?

在love2d中,屏幕内容在draw调用之间重置。这意味着我无法在上一次draw操作期间创建的屏幕上添加内容,例如在上一次迭代期间打印下一行。

如何在爱游戏引擎中实现?具体来说,我有一个调试区域和主游戏区域,并希望在该窗口中打印日志消息。

其他用例包括在玩家获胜(或失败)时在游戏区域上绘制一些效果,以及在显示对话框时模糊背景。

点赞
用户8291949
用户8291949

我不知道有没有视觉调试控制台。但是,在绘制调用期间操作像素可以使用某种着色器方法来完成。这里是一个高斯模糊像素效果的示例:

local graphics = love.graphics
function love.load()
    local program = ([[
        const float kernel[5] = float[](0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162);
        vec4 effect(vec4 color, sampler2D tex, vec2 tex_coords, vec2 pos) {
            color = texture2D(tex, tex_coords) * kernel[0];
            for(int i = 1; i < 5; i++) {
                color += texture2D(tex, vec2(tex_coords.x + i * %f, tex_coords.y)) * kernel[i];
                color += texture2D(tex, vec2(tex_coords.x - i * %f, tex_coords.y)) * kernel[i];
            }
            return color;
        }
    ]]):format(1 / graphics.getWidth(), 1 / graphics.getWidth())
    fx = graphics.newPixelEffect(program)

    local program = ([[
        const float kernel[5] = float[](0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162);
        vec4 effect(vec4 color, sampler2D tex, vec2 tex_coords, vec2 pos) {
            color = texture2D(tex, tex_coords) * kernel[0];
            for(int i = 1; i < 5; i++) {
                color += texture2D(tex, vec2(tex_coords.x, tex_coords.y + i * %f)) * kernel[i];
                color += texture2D(tex, vec2(tex_coords.x, tex_coords.y - i * %f)) * kernel[i];
            }
            return color;
        }
    ]]):format(1 / graphics.getHeight(), 1 / graphics.getHeight())
    fy = graphics.newPixelEffect(program)

    print(fx:getWarnings())
    print(fy:getWarnings())

    canvas_x = graphics.newCanvas(graphics.width, graphics.height)
    canvas_y = graphics.newCanvas(graphics.width, graphics.height)
end

t = 0

function love.draw()
    t = t + 0.02
    local x = 400 + math.sin(t) * 400
    local y = 300 + math.sin(t * 0.8) * 300

    graphics.setCanvas(canvas_x)
    graphics.push()
    graphics.translate(x, y)
    graphics.rotate(t * 1.3)
    graphics.rectangle("fill", -10, -50, 20, 100)
    graphics.pop()

    graphics.setPixelEffect(fx)
    graphics.setCanvas(canvas_y)
    graphics.draw(canvas_x, 0, 0)

    graphics.setPixelEffect(fy)
    graphics.setCanvas(canvas_x)
    graphics.draw(canvas_y, 0, 0)

    graphics.setPixelEffect()
    graphics.setCanvas()
    graphics.draw(canvas_x, 0, 0)
end
2018-07-06 16:58:22
用户10391157
用户10391157

Love2d的默认循环会调用love.draw,并自动清除屏幕。

请参见https://love2d.org/wiki/love.run

为了避免这种情况,可以使用自己的运行函数并移除love.graphics.clear(),或者可以使用canvas https://love2d.org/wiki/Canvas

2018-09-20 11:58:14