You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50G五十鸟项目:暂停状态下图片显示层级问题求助

解决暂停图片显示在元素后方的问题

问题根源有两个:

  • 函数嵌套错误:你把PlayState:render()定义在了PlayState:update()的if not self.pause分支里,这会导致render函数只有在非暂停状态下才会被创建,逻辑完全混乱。
  • 绘制顺序错误:Love2d的绘制是按代码顺序叠加的,后绘制的元素会覆盖先绘制的。你之前把暂停图片画在小鸟之前,导致小鸟会盖在它上面。

修正后的代码

function PlayState:update(dt)
    if love.keyboard.wasPressed('p') then
        if self.pause then
            self.pause = false
            scrolling = true
            sounds['music']:play()
            sounds['pause']:pause()
        else
            self.pause = true
            scrolling = false
            sounds['music']:pause()
            sounds['pause']:play()
        end
    end

    -- 只有非暂停时才更新游戏元素
    if not self.pause then
        self.bird:update(dt)
        -- 这里补充管道、碰撞检测等其他更新逻辑
    end
end

function PlayState:render()
    -- 1. 绘制管道(最底层)
    for k, pair in pairs(self.pipePairs) do
        pair:render()
    end

    -- 2. 绘制分数
    love.graphics.setFont(flappyFont)
    love.graphics.print('Score: ' .. tostring(self.score), 8, 8)
    
    -- 3. 绘制小鸟
    self.bird:render()

    -- 4. 最后绘制暂停图片(最上层,不会被任何元素覆盖)
    if self.pause then
        -- 如果要让图片居中,建议用屏幕宽高减去图片宽高的一半计算坐标
        local x = VIRTUAL_WIDTH / 2 - pause:getWidth() / 2
        local y = VIRTUAL_HEIGHT / 2 - pause:getHeight() / 2
        love.graphics.draw(pause, x, y)
    end
end

关键说明

  1. 把update和render拆成两个独立的方法,不要嵌套,这是Love2d状态类的基本写法。
  2. 调整绘制顺序:暂停图片必须放在所有游戏元素绘制完成后再画,这样它就会处于最前景。
  3. 优化暂停图片的坐标计算,用屏幕和图片的尺寸来居中,比固定坐标更适配。

内容的提问来源于stack exchange,提问作者Mrs.mewis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:35:08