You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Love2D Lua鼠标点击事件逻辑异常及绘图函数调用失效问题求助

解决Love2D状态控制与渲染的两个问题

让我帮你逐个拆解并解决这两个问题:

问题1:第一次点击就触发消息打印

原因分析

你的代码逻辑里,第一次点击时,第一个if语句会把statemenu改成play,紧接着第二个if语句就会检查当前的state——这时候state已经是play了,所以会直接把printMsg设为true,导致第一次点击就触发了消息绘制。两个if是独立判断的,同一帧内会依次执行。

解决方案

把第二个if改成elseif,这样当第一个条件满足时,第二个条件就不会被执行;同时记得初始化printMsg变量(全局变量最好在love.load里初始化,避免未定义的问题):

function love.load()
    state = 'menu'
    printMsg = false  -- 初始化标记变量
end

function love.draw()
    if printMsg then
        love.graphics.print('mousepressed', 10, 10)  -- 加上坐标,避免文本在屏幕外
    end
end

function love.mousepressed(x, y, button)
    -- 注意:Love2D中左键是button==1,右键是button==2,按需修改!
    if state == 'menu' and button == 1 then
        state = 'play'
        printMsg = false  -- 切换状态时重置标记
    elseif state == 'play' and button == 1 then
        printMsg = true
    end
end

问题2:在love.mousepressed中调用love.graphics.print无效果

原因分析

Love2D的运行流程是分阶段的:每一帧先处理输入事件(比如mousepressed),然后执行love.update,最后才调用love.draw进行渲染。所有的绘图指令只有在love.draw函数里才会被引擎处理,在事件函数里直接调用love.graphics.print,这些指令会被直接忽略,不会显示在屏幕上。

解决方案

必须通过状态变量(比如你之前的printMsg)来传递“是否需要绘制消息”的状态,然后在love.draw函数里根据这个状态执行绘图操作——就像你最初的代码思路那样,只是需要修正第一个问题的逻辑即可。

另外补充个小提醒:如果你实际想通过右键触发操作,记得把代码里的button == 1改成button == 2,因为Love2D的按键编号是:左键=1,右键=2,中键=3。

内容的提问来源于stack exchange,提问作者user16999379

火山引擎 最新活动