Pygame碰撞检测后切换背景时如何正确显示对应数量的气球?
你的代码存在三个核心问题导致气球数量显示异常:
- 直接修改了原始气球图片资源的透明度,全局的气球素材被修改后无法在切换背景时恢复显示
- 没有维护气球数量配额变量,仅用固定的
num_balloons=7,无法随击中次数动态调整显示数量 - 切换背景时没有重新生成对应数量的气球位置,始终复用首次生成的7个气球坐标
修改后的完整代码
import pygame as pg import random as r import sys pg.init() # 背景资源 bg = pg.image.load('bg.jpg') bg = pg.transform.scale(bg, (688,387)) new_bg = pg.image.load('new_bg.jpg') new_bg = pg.transform.scale(new_bg, (688,387)) radius = 30 diameter = 2 * radius # 原始气球素材(不做修改,仅作复制使用) raw_balloons = [] for i in range(1,8): b = pg.image.load(f'balloons/{i}.png').convert_alpha() b = pg.transform.scale(b, (63,131)) raw_balloons.append(b) gun = pg.image.load('game-gun.png').convert_alpha() gun = pg.transform.scale(gun, (150,150)) screen = pg.display.set_mode((688 ,387)) pg.display.set_caption("Remember") clock = pg.time.Clock() # 游戏状态变量 current_quota = 7 # 当前每个背景的气球显示配额 hit_count = 0 # 累计击中次数,每击中2次配额减1 bg_bool = False # 背景切换标记 balloon_list = [] # 当前页面的气球x坐标列表 x = 0 y = 250 velocity = 5 def create_balloons(count): """按指定数量生成不重叠的气球x坐标""" balloons = [] for i in range(count): while True: candidate = r.randint(0, 500) if all(abs(candidate-x) >= diameter for x in balloons): break balloons.append(candidate) return balloons def draw_balloons(y): """按当前配额绘制气球""" for i in range(current_quota): screen.blit(raw_balloons[i], (balloon_list[i], y-50)) def check_collisions(x, y): global bg_bool, hit_count, current_quota, balloon_list for i in range(current_quota): gun_rect = gun.get_rect(topleft = (x,y)) gun_mask = pg.mask.from_surface(gun) balloon_rect = raw_balloons[i].get_rect(topleft = (balloon_list[i], y-100)) balloon_mask = pg.mask.from_surface(raw_balloons[i]) offset = (balloon_rect.x - gun_rect.x), (balloon_rect.y - gun_rect.y) if gun_mask.overlap(balloon_mask, offset): # 击中后切换背景 bg_bool = not bg_bool hit_count += 1 # 每击中2次(两个背景各1次),配额减1 if hit_count % 2 == 0: current_quota = max(0, current_quota - 1) # 切换背景后重新生成对应配额的气球 balloon_list = create_balloons(current_quota) return # 初始化首次气球 balloon_list = create_balloons(current_quota) running = True while running: clock.tick(60) # 绘制背景 screen.blit(new_bg if bg_bool else bg, (0,0)) for event in pg.event.get(): if event.type == pg.QUIT: pg.quit() sys.exit() if event.type == pg.KEYDOWN: if event.key == pg.K_ESCAPE: running = False if event.key == pg.K_SPACE: check_collisions(x, y) # 绘制气球 draw_balloons(y) # 枪的移动逻辑,增加边界限制 keys = pg.key.get_pressed() x += (keys[pg.K_RIGHT] - keys[pg.K_LEFT]) * velocity x = max(0, min(x, 688 - 150)) screen.blit(gun, (x, y)) pg.display.update()
核心修改说明
- 拆分了原始气球素材和运行时变量,不再修改原始资源保证切换背景时可以正常显示气球
- 新增
current_quota变量控制每个背景的气球显示数量,新增hit_count变量统计击中次数,每两个背景各击中一次后配额减1,完全符合你要求的7,7 → 6,6 → ... →1,1的数量变化逻辑 - 每次切换背景时自动重新生成对应数量的不重叠气球位置
- 优化了枪的移动逻辑,增加边界限制避免枪移出屏幕
内容的提问来源于stack exchange,提问作者Krishay Rastogi
相关产品推荐
相关产品推荐

