Pygame开发太空射击游戏时,松开空格键子弹无法持续飞行还跟随玩家移动如何解决
问题根源
- 子弹松开空格就停止飞行:你仅在检测到空格键被按住时才更新子弹Y轴坐标,松开按键后更新逻辑终止,子弹自然停止移动
- 子弹跟随玩家横向偏移:你在玩家左右移动的逻辑中同步修改了子弹的X轴坐标,相当于把子弹和玩家做了位置绑定,飞行过程中也会跟着玩家移动
修复步骤
- 新增
bullet_fired状态变量,标记当前是否有子弹处于飞行状态,初始值为False - 删除玩家左右移动逻辑中修改
playerBulletX的代码,子弹射出后X轴坐标固定不再变化 - 调整空格键触发逻辑:按下空格且当前无子弹飞行时,初始化子弹坐标并标记为已发射
- 新增独立的子弹飞行更新逻辑:只要子弹处于发射状态,每帧都自动更新Y轴坐标,飞出屏幕顶部后重置发射状态
修复后完整代码
import pygame # initialize the pygame pygame.init() # create the screen screen = pygame.display.set_mode((800, 600)) # Title and icon pygame.display.set_caption("Space Invaders") icon = pygame.image.load('Invader2.xcf') pygame.display.set_icon(icon) # Player playerImg = pygame.image.load('Player.xcf') player_big = pygame.transform.scale(playerImg, (48, 48)) playerX = 370 playerY = 480 vel = 0.15 # Player Bullets playerBulletImg = pygame.image.load('Player_bullet.xcf') playerBulletX = 0 playerBulletY = 0 bulletVel = 0.5 # 新增子弹发射状态 bullet_fired = False def player(x, y): screen.blit(player_big, (x, y)) def bullet(x, y): screen.blit(playerBulletImg, (x, y)) # Game Loop running = True while running: # RGB 注:pygame RGB取值范围为0-255,已将原小数参数转换为对应整数 screen.fill((48, 213, 200)) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() # 玩家移动逻辑,不再修改子弹X坐标 if keys[pygame.K_LEFT] and playerX > 0: playerX -= vel if keys[pygame.K_RIGHT] and playerX < 800 - 48: playerX += vel # 空格发射逻辑:只有未发射状态才触发 if keys[pygame.K_SPACE] and not bullet_fired: playerBulletX = playerX + 16 playerBulletY = playerY + 10 bullet_fired = True # 子弹独立飞行逻辑,和按键状态无关 if bullet_fired: playerBulletY -= bulletVel # 子弹飞出屏幕顶部就重置状态 if playerBulletY <= 0: bullet_fired = False else: bullet(playerBulletX, playerBulletY) player(playerX, playerY) pygame.display.update()
内容的提问来源于stack exchange,提问作者Elijah Abdella
相关产品推荐
相关产品推荐

