如何解决pygame绘制随机圆重叠问题?不使用图片怎么绘制气球形状?
气球重叠问题修复方案
你当前的代码存在两个核心问题导致重叠+运行异常:
- 生成x坐标时没有和已生成的坐标做距离校验:两个半径30的圆形,圆心水平距离小于60就会重叠
- 把气球生成逻辑写在了每帧执行的draw函数里,每次循环都会往balloon_list里追加7个新元素,不仅会导致重复绘制,列表也会无限膨胀
修改思路:
- 把气球坐标、颜色的生成逻辑单独提取,在游戏启动时一次性完成
- 每次生成新的x坐标时,循环校验和已有x的距离,直到生成符合不重叠要求的坐标为止
修改后的参考代码:
import pygame as pg import random as r import sys pg.init() def generate_balloons(count=7, min_gap=60, x_max=500): balloon_list = [] colors = [] for _ in range(count): # 循环生成直到找到不重叠的x坐标 while True: balloon_x = r.randint(0, x_max) # 校验和已有的所有x的距离 if all(abs(balloon_x - exist_x) >= min_gap for exist_x in balloon_list): break balloon_color = (r.choice([0,255]), r.randint(0,255), r.choice([0,255])) balloon_list.append(balloon_x) colors.append(balloon_color) return balloon_list, colors def draw_balloons(balloon_list, colors, y): for i in range(len(balloon_list)): pg.draw.circle(screen, colors[i], (balloon_list[i], y), radius=30) # Vars # y = 250 velocity = 5 clock = pg.time.Clock() screen = pg.display.set_mode((688 ,387)) screen.fill('#ffffff') pg.display.set_caption("Remember") # 一次性生成气球坐标和颜色 balloon_list, colors = generate_balloons() running = True while running: clock.tick(60) 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: pg.quit() sys.exit() screen.fill('#ffffff') # 每帧重绘背景,避免绘制残留 draw_balloons(balloon_list, colors, y) pg.display.update()
无外部资源实现气球造型方案
直接用pygame内置的绘制函数组合就能实现接近真实的气球效果,组合逻辑如下:
- 用
pygame.draw.ellipse()绘制竖椭圆作为气球主体,比正圆更符合气球的形态 - 用
pygame.draw.polygon()在椭圆底部绘制小三角形作为气球封口 - 用
pygame.draw.line()从封口向下绘制细线作为气球绳 - 可选:在气球左上角加一个小的白色圆形作为高光,增加立体感
把上面的draw_balloons函数替换成下面的代码即可:
def draw_balloons(balloon_list, colors, y): for i in range(len(balloon_list)): x = balloon_list[i] color = colors[i] # 1. 气球主体:竖椭圆,宽50,高65 pg.draw.ellipse(screen, color, (x-25, y-40, 50, 65)) # 2. 底部封口小三角 pg.draw.polygon(screen, color, [(x, y+25), (x-8, y+15), (x+8, y+15)]) # 3. 气球绳,长度80 pg.draw.line(screen, (0,0,0), (x, y+25), (x, y+105), 2) # 4. 高光小白点 pg.draw.circle(screen, (255,255,255), (x-12, y-25), 5)
你可以根据自己的需求调整各部分的尺寸、颜色参数。
内容的提问来源于stack exchange,提问作者Krishay Rastogi
相关产品推荐
相关产品推荐

