import pygame
import random
import math
import cv2
import numpy as np
from datetime import datetime
# 初始化pygame
pygame.init()
# 设置窗口
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("爱心文字动画")
# 文字列表
texts = [
"王卿云", "王卿云我爱你", "我一直在你身边", "我一直等你",
"想你", "想你", "还是放不下你", "世界因你柔软",
"想你成习惯了", "喜欢你很久了", "你是独一无二的光", "月光为你亮",
"星光为你闪", "你眼里 月光为你亮 心里", "心湖为你起浪", "今夜的梦你",
"此刻的风想你", "你是人间的奇迹", "所有浪漫都与你有关", "为你心动不止",
"想和你看星", "一眸也是永恒", "风都是甜的", "温柔落人间",
"你的名字是我心事", "心有桃花一片", "你是我的心动", "想你靠近一点"
]
# 文字类
class Text:
def __init__(self, text):
self.text = text
self.font = pygame.font.SysFont("SimHei", random.randint(20, 30))
self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
self.x = random.randint(0, width)
self.y = random.randint(0, height)
self.speed = random.uniform(0.5, 1.5)
self.angle = random.uniform(0, math.pi * 2)
self.target_x = width // 2
self.target_y = height // 2
self.radius = random.uniform(100, 200)
def update(self):
# 计算到目标点(爱心中心)的向量
dx = self.target_x - self.x
dy = self.target_y - self.y
distance = math.sqrt(dx ** 2 + dy ** 2)
if distance > 1:
self.x += dx * self.speed / distance
self.y += dy * self.speed / distance
else:
# 围绕爱心中心做圆周运动
self.angle += 0.01
self.x = self.target_x + math.cos(self.angle) * self.radius
self.y = self.target_y + math.sin(self.angle) * self.radius * 0.7 # 调整y方向使形状更像爱心
def draw(self, surface):
text_surface = self.font.render(self.text, True, self.color)
surface.blit(text_surface, (self.x, self.y))
# 创建文字对象列表
text_objects = [Text(text) for text in texts * 3] # 复制多份文字增加数量
# 爱心函数(用于判断是否在爱心区域)
def is_in_heart(x, y, center_x, center_y, size):
x = (x - center_x) / size
y = (y - center_y) / size
y = -y # 翻转y轴
a = 1
return (x ** 2 + y ** 2 - 1) ** 3 - x ** 2 * y ** 3 <= 0
# 用于保存帧的列表
frames = []
# 视频时长(帧数),可根据需要调整
total_frames = 300
fps = 30 # 视频帧率
# 主循环
running = True
clock = pygame.time.Clock()
frame_count = 0
while running and frame_count < total_frames:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((240, 240, 255)) # 背景色
for text_obj in text_objects:
text_obj.update()
text_obj.draw(screen)
# 绘制中心文字
center_font = pygame.font.SysFont("SimHei", 40)
center_text = center_font.render("for you ❤", True, (255, 100, 150))
screen.blit(center_text, (width // 2 - center_text.get_width() // 2, height // 2 - center_text.get_height() // 2))
# 保存当前帧
pygame_image = pygame.surfarray.array3d(screen)
# 转换为opencv的BGR格式
cv_image = cv2.cvtColor(pygame_image, cv2.COLOR_RGB2BGR)
frames.append(cv_image)
pygame.display.flip()
clock.tick(fps)
frame_count += 1
# 生成视频
if frames:
now = datetime.now().strftime("%Y%m%d%H%M%S")
video_name = f"爱心文字动画_{now}.mp4"
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
video_writer = cv2.VideoWriter(video_name, fourcc, fps, (width, height))
for frame in frames:
video_writer.write(frame)
video_writer.release()
print(f"视频已生成:{video_name}")
pygame.quit()
最新发布