PyGame开发Flappy Bird克隆时上方管道不显示问题求助
PyGame开发Flappy Bird时上方管道不显示的问题修复
你的代码里有几个关键问题导致上方管道无法正常显示,逐个解决:
1. 绘制顺序完全搞反
在main循环里,你先调用draw()绘制元素,再执行WIN.fill(BG_COLOR)填充背景——这等于刚画好的管道和玩家立刻被背景盖住了。必须先填充背景,再绘制所有元素。
2. 管道重置函数调用缺参数
generate_pipe_pos定义时需要接收pipe_up和pipe_down两个参数,但你在main里调用时写的是generate_pipe_pos(),根本没传参,导致管道重置逻辑完全没生效。
3. 上方管道的Rect设置错误
你把pipe_up.height设成了-40,PyGame的Rect高度不能为负数,这会直接让管道消失。正确做法是保持高度为300,通过调整y坐标让管道从屏幕上方伸下来,比如让pipe_up.y为负数,让管道一部分在屏幕外、一部分在屏幕内。
4. 玩家移动的velocity变量未生效
move_player里修改的velocity是局部变量,不会影响main里的全局velocity,导致玩家移动逻辑异常。可以把velocity设为全局变量,或者让函数返回新的velocity值。
修正后的完整代码
import pygame import random WIDTH, HEIGHT = 600, 700 BG_COLOR = (100,255,255) PLAYER_WIDTH = PLAYER_HEIGHT = 50 PLAYER_COLOR = (255, 255, 50) PLAYER_SPEED = 1 PIPE_COLOR = (100, 255, 100) PIPE_WIDTH, PIPE_HEIGHT = 50, 300 velocity = 0 WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Flat Bird") def draw(player, pipe_up, pipe_down): pygame.draw.rect(WIN, PLAYER_COLOR, player) pygame.draw.rect(WIN, PIPE_COLOR, pipe_up) pygame.draw.rect(WIN, PIPE_COLOR, pipe_down) pygame.display.update() def move_player(player, speed): global velocity keys = pygame.key.get_pressed() velocity -= speed if keys[pygame.K_SPACE]: velocity = 5 # 调大数值更贴合Flappy Bird手感 player.y -= velocity # 限制玩家不超出屏幕边界 if player.top < 0: player.top = 0 if player.bottom > HEIGHT: player.bottom = HEIGHT def generate_pipe_pos(pipe_up, pipe_down): offset = random.randint(-100, 100) # 加大偏移范围提升游戏难度 # 重置上方管道:x回到屏幕右侧,y设为负让管道从上方延伸 pipe_up.x = WIDTH pipe_up.y = -PIPE_HEIGHT + offset # 重置下方管道:x与上方对齐,y保持和上方管道的间隙 pipe_down.x = WIDTH pipe_down.y = HEIGHT // 2 + 150 + offset # 150为上下管道的固定间隙 def main(): player = pygame.Rect(100, 350, PLAYER_WIDTH, PLAYER_HEIGHT) # 初始化上方管道:y设为负,高度保持300 pipe_up = pygame.Rect(WIDTH, -PIPE_HEIGHT, PIPE_WIDTH, PIPE_HEIGHT) pipe_down = pygame.Rect(WIDTH, 440, PIPE_WIDTH, PIPE_HEIGHT) run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False move_player(player, PLAYER_SPEED) pipe_up.x -= PLAYER_SPEED pipe_down.x -= PLAYER_SPEED # 管道完全移出屏幕左侧时重置位置 if pipe_up.x < -PIPE_WIDTH: generate_pipe_pos(pipe_up, pipe_down) # 先填充背景,再绘制元素 WIN.fill(BG_COLOR) draw(player, pipe_up, pipe_down) pygame.quit() main()
内容的提问来源于stack exchange,提问作者NoobGangNB1234
相关产品推荐
相关产品推荐

