使用Pygame开发Flappy Bird克隆版:Sprite.draw仅显示下方柱子求助
解决Flappy Bird克隆中仅显示下柱子的问题
嘿,我来帮你排查下这个问题!这种Sprite绘制的小坑我之前开发类似游戏时也踩过,咱们一步步来梳理可能的原因和解决办法:
最可能的原因:默认Sprite.draw只处理单个rect
Pygame的Sprite类默认的draw方法只会把self.image绘制到self.rect指定的位置。如果你的Pillar类里只把self.rect绑定到了下柱子的p_lower,那上柱子p_upper根本不会被默认的绘制逻辑处理,自然就看不到了。
解决方法:重写Pillar类的draw方法
不要依赖默认的Sprite绘制逻辑,自己在draw方法里分别绘制两个柱子。示例代码如下:
import pygame import random class Pillar(pygame.sprite.Sprite): def __init__(self, screen_width, screen_height): super().__init__() self.pillar_width = 50 self.gap_size = 150 # 上下柱子的间隙 self.speed = 2 # 初始化上柱子:让一部分在屏幕外,保证顶部超出,底部留在屏幕内 upper_height = random.randint(100, screen_height - self.gap_size - 100) self.p_upper = pygame.Rect(screen_width, -upper_height, self.pillar_width, upper_height + 50) # 初始化下柱子:和上柱子保持间隙 self.p_lower = pygame.Rect(screen_width, self.p_upper.bottom + self.gap_size, self.pillar_width, screen_height - (self.p_upper.bottom + self.gap_size)) # 可选:给柱子设置颜色(和背景区分开) self.pillar_color = (0, 255, 0) # 绿色 def update(self): # 让两个柱子一起移动(你要向右移动就把减号改成加号) self.p_upper.x -= self.speed self.p_lower.x -= self.speed # 柱子移出屏幕后销毁(可选优化) if self.p_upper.right < 0: self.kill() def draw(self, screen): # 分别绘制上下两个柱子 pygame.draw.rect(screen, self.pillar_color, self.p_upper) pygame.draw.rect(screen, self.pillar_color, self.p_lower)
之后在主循环里,调用pillar.draw(screen)来绘制柱子,而不是依赖精灵组的默认draw方法,这样就能同时渲染两个柱子了。
其他可能的排查点
- 上柱子位置完全超出屏幕:检查
p_upper的y坐标,Pygame坐标系左上角是(0,0),如果p_upper.bottom小于0,那整个上柱子都在屏幕上方,自然看不到。调整初始化时的y值,让上柱子底部留在屏幕内。 - 颜色和背景重合:确认上柱子的填充颜色和游戏背景色不一样,比如背景是白色,柱子就别设成白色。
- update方法漏更上柱子:检查
update里是不是只修改了p_lower的x坐标,忘记同步p_upper的位置。
内容的提问来源于stack exchange,提问作者Tauheed Ahmad
相关产品推荐
相关产品推荐

