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
关键说明
- 把
update和render拆成两个独立的方法,不要嵌套,这是Love2d状态类的基本写法。 - 调整绘制顺序:暂停图片必须放在所有游戏元素绘制完成后再画,这样它就会处于最前景。
- 优化暂停图片的坐标计算,用屏幕和图片的尺寸来居中,比固定坐标更适配。
内容的提问来源于stack exchange,提问作者Mrs.mewis
相关产品推荐
相关产品推荐

