You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将圆形按颜色分组放置多图层实现同步移动(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:15:07