import pygameimport sysimport randomfrom PIL import Image# 初始化pygame.init()screen = pygame.display.set_mode((800, 600))pygame.display.set_caption("💖 专属表白特效")# 颜色定义BLACK = (10, 10, 30)PINK = (255, 105, 180)RED = (255, 50, 100)WHITE = (255, 255, 255)GOLD = (255, 215, 0)# 使用支持中文的字体font_big = pygame.font.SysFont('microsoftyahei', 80)font_small = pygame.font.SysFont('microsoftyahei', 36)# 心形飘落粒子class Heart: def __init__(self): self.x = random.randint(0, 800) self.y = random.randint(-100, 0) self.size = random.randint(8, 20) self.speed = random.uniform(1, 3) self.color = random.choice([PINK, RED, (255, 182, 193)]) self.alpha = random.randint(150, 255) def update(self): self.y += self.speed if self.y > 600: self.y = random.randint(-100, 0) self.x = random.randint(0, 800) def draw(self, surface): heart_surface = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA) pygame.draw.circle(heart_surface, (*self.color, self.alpha), (self.size // 2, self.size // 2), self.size // 2) pygame.draw.circle(heart_surface, (*self.color, self.alpha), (self.size * 3 // 2, self.size // 2), self.size // 2) pygame.draw.polygon(heart_surface, (*self.color, self.alpha), [ (self.size, self.size * 1.5), (0, self.size // 2), (self.size * 2, self.size // 2) ]) surface.blit(heart_surface, (self.x - self.size, self.y - self.size))# 创建心形粒子hearts = [Heart() for _ in range(50)]# 主循环clock = pygame.time.Clock()running = True# GIF保存相关save_gif = True # 设置为True保存GIFframes = [] # 存储帧max_frames = 150 # 保存的帧数(约2.5秒,60fps)frame_count = 0print("💖 开始录制动画...")while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False if event.key == pygame.K_s: # 按S键保存GIF save_gif = True frames = [] frame_count = 0 print("📸 重新开始录制...") screen.fill(BLACK) # 绘制星星(固定种子让星星位置一致,GIF更流畅) random.seed(42) for _ in range(100): x = random.randint(0, 800) y = random.randint(0, 600) size = random.randint(1, 2) pygame.draw.circle(screen, WHITE, (x, y), size) random.seed() # 恢复随机种子 # 更新和绘制心形 for heart in hearts: heart.update() heart.draw(screen) # 绘制文字 text = font_big.render("I LOVE YOU", True, GOLD) text_rect = text.get_rect(center=(400, 250)) screen.blit(text, text_rect) name_text = font_small.render("To: 我最爱的你", True, PINK) name_rect = name_text.get_rect(center=(400, 350)) screen.blit(name_text, name_rect) date_text = font_small.render("2026.03.25", True, WHITE) date_rect = date_text.get_rect(center=(400, 400)) screen.blit(date_text, date_rect) # 保存帧用于GIF if save_gif and frame_count < max_frames: # 将pygame表面转换为PIL图像 frame_data = pygame.image.tostring(screen, 'RGB') frame = Image.frombytes('RGB', (800, 600), frame_data) frames.append(frame) frame_count += 1 print(f"📷 已捕获帧: {frame_count}/{max_frames}", end='\r') pygame.display.flip() clock.tick(60)# 保存GIFif frames: print("\n💾 正在保存GIF...") # 优化:减少颜色数量使GIF更小 frames[0].save( 'love_animation.gif', save_all=True, append_images=frames[1:], duration=50, # 每帧50毫秒(20fps) loop=0, # 无限循环 optimize=True ) print("✅ GIF保存成功!文件:love_animation.gif")pygame.quit()sys.exit()