PyGame游戏按Space/E/F崩溃及方块上移实现求助
PyGame射击游戏崩溃与子弹移动问题修复
问题根源
- 程序崩溃原因:按下Space/E/F键时的嵌套
while (yb > -40)循环会完全阻塞主游戏循环,导致PyGame无法处理窗口事件、键盘输入等,直接造成程序无响应崩溃。同时这段代码里yb = yb +5是让方块向下移动,和需求的向上移动相反。 - 额外隐患:使用第三方
keyboard库和time.sleep()会打乱PyGame的事件调度机制,容易引发输入延迟和界面卡顿。
修复方案
- 改用PyGame原生的
pygame.key.get_pressed()处理按键输入,移除keyboard库依赖。 - 用
pygame.time.Clock()控制游戏帧率,替代time.sleep()实现平滑动画。 - 将子弹移动逻辑整合到主循环中,用状态变量跟踪子弹是否处于活跃状态,避免嵌套循环阻塞主流程。
- 修正子弹移动方向,通过
yb -= 5实现向上移动,并在子弹出界后重置位置,支持重复发射。
修复后的完整代码
import pygame # 初始化PyGame pygame.init() # 玩家与子弹初始位置 player_x = 30 player_y = 670 bullet_x = 30 bullet_y = 670 bullet_active = False # 标记子弹是否正在移动 # 游戏配置 background_colour = (10, 10, 10) screen = pygame.display.set_mode((800, 750), pygame.RESIZABLE) pygame.display.set_caption('shooter') clock = pygame.time.Clock() # 用于控制帧率 def draw_player(): """绘制玩家飞船""" color = (40, 40, 45) pygame.draw.rect(screen, color, pygame.Rect(player_x, player_y, 60, 60)) pygame.draw.polygon(screen, color, ((player_x+60, player_y), (player_x+30, player_y-80), (player_x, player_y))) pygame.draw.polygon(screen, color, ((player_x-20, player_y+52.5), (player_x+30, player_y+70), (player_x+80, player_y+52.5))) color = (60, 60, 65) pygame.draw.rect(screen, color, pygame.Rect((player_x-70), (player_y+20), 200, 30)) color = (40, 40, 45) pygame.draw.rect(screen, color, pygame.Rect(player_x-70, player_y-20, 20, 40)) pygame.draw.rect(screen, color, pygame.Rect(player_x+110, player_y-20, 20, 40)) def update_bullet(): """更新子弹位置,处理出界重置""" global bullet_y, bullet_active if bullet_active: bullet_y -= 5 # 向上移动 if bullet_y < -40: bullet_active = False bullet_y = player_y # 重置到玩家位置 running = True while running: # 处理PyGame事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 处理按键按下事件(发射子弹) if event.type == pygame.KEYDOWN: if not bullet_active and (event.key in (pygame.K_SPACE, pygame.K_e, pygame.K_f)): bullet_active = True bullet_x = player_x # 子弹跟随玩家位置 bullet_y = player_y # 获取持续按下的按键,处理玩家移动 keys = pygame.key.get_pressed() if keys[pygame.K_a] or keys[pygame.K_LEFT]: player_x -= 3.75 if keys[pygame.K_d] or keys[pygame.K_RIGHT]: player_x += 3.75 # 更新游戏状态 update_bullet() # 绘制所有元素 screen.fill(background_colour) draw_player() if bullet_active: pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(bullet_x, bullet_y, 60, 60)) # 更新显示 pygame.display.flip() clock.tick(60) # 控制帧率为60FPS pygame.quit()
关键改动说明
- 新增
bullet_active状态变量,仅在子弹未活跃时允许发射,避免重复生成子弹。 - 玩家移动逻辑改为在主循环中处理,通过
clock.tick(60)保证移动速度稳定,不受性能影响。 - 子弹移动整合到
update_bullet函数,在主循环中逐帧更新,不再阻塞主流程。 - 使用PyGame原生事件系统处理按键按下(发射)和持续按键(移动),输入响应更稳定。
内容的提问来源于stack exchange,提问作者Logan Larrabee
相关产品推荐
相关产品推荐

