如何将圆形按颜色分组放置多图层实现同步移动(Python实现)
螺旋花图案同色圆形同步移动实现方案
核心实现思路
- 为每个圆形独立存储属性:颜色、初始角度、当前移动距离、透明图层Surface,支持按颜色快速筛选同组圆形
- 单独定义移动顺序列表,严格遵循「白色先移动、蓝色次之、其余颜色按指定顺序执行」的要求
- 采用逐帧更新逻辑:同一帧内更新当前颜色组所有圆形的位置,保证视觉上的同步移动效果,当前组所有圆形移出屏幕后自动切换到下一个颜色组
完整可运行代码
import pygame import math # 基础配置 WHITE = (255, 255, 255) BLUE = (0, 0, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) ORANGE = (255, 127, 0) YELLOW = (255, 255, 0) PURPLE = (160, 32, 240) # 移动顺序:白色先,然后蓝色,剩余颜色按顺序执行 MOVE_ORDER = [WHITE, BLUE, RED, GREEN, ORANGE, YELLOW, PURPLE] # 每组颜色的圆形数量 GROUP_COUNT = 5 TOTAL_CIRCLE = GROUP_COUNT * len(MOVE_ORDER) TURN_ANGLE = 360 / TOTAL_CIRCLE SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 CENTER = (SCREEN_WIDTH//2, SCREEN_HEIGHT//2) RADIUS = 100 MOVE_SPEED = 3 # 移出屏幕的距离阈值 MAX_DIST = 400 pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) clock = pygame.time.Clock() running = True # 存储所有圆形的属性:图层、颜色、初始角度、当前离中心距离 circles = [] # 初始化所有圆形 alpha = TURN_ANGLE for i in range(GROUP_COUNT): for color in MOVE_ORDER: # 创建透明图层 surf = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA) # 计算初始圆心坐标 x = CENTER[0] + RADIUS * math.cos(math.radians(alpha)) y = CENTER[1] + RADIUS * math.sin(math.radians(alpha)) pygame.draw.circle(surf, color, (x, y), RADIUS, width=2) # 存储圆形属性 circles.append({ "surf": surf, "color": color, "angle": alpha, "dist": RADIUS }) alpha += TURN_ANGLE # 动画状态控制:当前正在移动的颜色索引 current_move_idx = 0 while running: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False break if not running: break screen.fill((0, 0, 0)) current_color = MOVE_ORDER[current_move_idx] all_out = True # 更新并绘制所有圆形 for circle in circles: if circle["color"] == current_color and circle["dist"] < MAX_DIST: # 同色圆形沿径向向外移动 circle["dist"] += MOVE_SPEED offset_x = circle["dist"] * math.cos(math.radians(circle["angle"])) offset_y = circle["dist"] * math.sin(math.radians(circle["angle"])) # 重新计算位置偏移 circle["surf"].fill((0,0,0,0)) new_x = CENTER[0] + offset_x new_y = CENTER[1] + offset_y pygame.draw.circle(circle["surf"], circle["color"], (new_x, new_y), RADIUS, 2) all_out = False # 绘制当前圆形 screen.blit(circle["surf"], (0,0)) # 当前颜色组所有圆形都移出屏幕,切换到下一个颜色组 if all_out and current_move_idx < len(MOVE_ORDER)-1: current_move_idx += 1 pygame.display.update() clock.tick(30) pygame.quit()
关键实现说明
- 同步移动效果:每帧内先完成当前颜色组所有圆形的位置更新,再统一渲染到屏幕,视觉上完全同步
- 顺序控制:通过
current_move_idx变量控制当前移动的颜色组,只有当前组所有圆形都移出屏幕后才会切换到下一组 - 移动方向:每个圆形沿自身初始角度的径向向外移动,符合向屏幕边缘移动的需求
- 边界处理:设置
MAX_DIST阈值,圆形移动到阈值距离后停止,避免无效计算
内容的提问来源于stack exchange,提问作者Ven
相关产品推荐
相关产品推荐

