系列文章
序号 | 直达链接 |
---|---|
Tkinter | |
1 | Python李峋同款可写字版跳动的爱心 |
2 | Python跳动的双爱心 |
3 | Python蓝色跳动的爱心 |
4 | Python动漫烟花 |
5 | Python粒子烟花 |
Turtle | |
1 | Python满屏飘字 |
2 | Python蓝色流星雨 |
3 | Python金色流星雨 |
4 | Python漂浮爱心 |
5 | Python爱心光波① |
6 | Python爱心光波② |
7 | Python满天繁星 |
8 | Python五彩气球 |
9 | Python白色飘雪 |
10 | Python七彩花朵 |
11 | Python 3D星空 |
12 | Python大雪纷飞 |
13 | Python一闪一闪亮星星 |
14 | Python爱心泡泡 |
15 | Python爱心射线 |
16 | Python圣诞礼物 |
17 | Python礼物圣诞树 |
18 | Python浪漫星空 |
19 | Python飞舞蝙蝠 |
20 | Python万圣礼物 |
21 | Python蓝色飘雪 |
Pygame | |
1 | Python跨年烟花 |
2 | Python炫酷烟花 |
3 | Python黑客帝国字母雨 |
敬请期待…… |
写在前面
Python实现漂浮爱心动画的完整代码。
技术需求
-
Turtle 图形库:
- 通过
turtle
库进行图形绘制,创建了动态的爱心动画。使用Pen()
创建画笔对象,控制画笔的运动、绘制和颜色等属性。turtle
库还提供了绘制基本几何图形(如圆形、直线等)的功能,适用于动画和图形界面的创建。
- 通过
-
面向对象编程 (OOP):
- 通过定义
Heart
类来实现爱心的对象化管理。每个爱心具有自己的属性(如位置、速度、颜色、半径等)和方法(如移动、绘制等)。这种设计方式使得每个爱心的行为独立且封装,方便管理和扩展。
- 通过定义
-
随机数生成:
- 使用
random
库生成随机数,为每个爱心的属性(如位置、大小、颜色、速度)赋予随机值,使得每次运行时爱心的位置、运动轨迹和速度都不相同,从而增加了动画的随机性和趣味性。
- 使用
-
数学计算:
- 使用
math
库中的三角函数sin()
来控制爱心左右的摆动。通过正弦函数的变化,爱心的水平运动轨迹呈现波动效果,模拟了自然的漂浮感觉。
- 使用
-
动态画布更新:
- 使用
tu.tracer(0)
和tu.update()
来优化画布的更新。tu.tracer(0)
禁用自动刷新,避免每次绘制时屏幕的闪烁;tu.update()
在所有绘制完成后一次性刷新屏幕,提高了动画的流畅度。
- 使用
-
无限循环与实时动画:
- 通过
while True
无限循环实现了爱心的持续漂浮和动态更新,模拟了连续的动画效果。每次循环都会更新爱心的位置,并重绘它们。
- 通过
完整代码
import turtle as tu
import random as ra
import mathtu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
t = tu.Pen()
t.ht()
colors = ['pink']
class Heart(): #每个爱心(爱心类)def __init__(self):self.r = ra.randint(10,15) #爱心的半径self.x = ra.randint(-1000,1000) #爱心的横坐标self.y = ra.randint(-500,500) #爱心的纵坐标self.f = ra.uniform(-3.14,3.14) #爱心左右移动呈正弦函数self.speed = ra.randint(5,10) #爱心移动速度self.color = ra.choice(colors) #爱心的颜色self.outline = 1 #爱心的外框大小(可不要)
……
代码分析
这段 Python 代码使用 turtle
库和 random
库创建了一种动态效果,其中多个爱心在屏幕上飘浮,模拟爱心随时间和运动的变化。下面将从代码的各个部分进行详细分析,重点关注代码的功能、实现过程、以及相关的技术细节。
1. 引入必要的库
import turtle as tu
import random as ra
import math
这段代码导入了三个库:
turtle
:Python 的一个图形绘制模块,常用于绘制简单的图形和动画。random
:用于生成随机数的库,代码中用它来随机生成爱心的属性(位置、速度等)。math
:提供数学运算支持,在这里用来处理一些运动的三角函数,特别是爱心的左右摆动。
2. 设置屏幕参数
tu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
tu.setup(1.0, 1.0)
设置了屏幕的宽度和高度为 1.0,即使用屏幕的最大范围。tu.screensize(1.0, 1.0)
设置了屏幕的显示区域,参数也为最大。
3. 创建画笔对象
t = tu.Pen()
t.ht()
t = tu.Pen()
创建了一个画笔对象t
,可以用它来控制 Turtle 画笔的状态和位置。t.ht()
隐藏了画笔。因为我们不需要在屏幕上看到画笔本身,只需绘制出爱心图形。
4. 定义颜色列表
colors = ['pink']
这里的颜色列表只包含一个颜色 'pink'
,表示所有爱心的颜色都将是粉色。这也使得整个动画具有统一的风格。
5. 定义 Heart 类
Heart
类用于表示一个爱心对象,每个实例代表一个漂浮的爱心。self.r
:随机生成爱心的半径,取值范围是 10 到 15。self.x
和self.y
:随机生成爱心的初始位置,x
在横轴上取值范围为 -1000 到 1000,y
在纵轴上取值范围为 -500 到 500。self.f
:随机生成一个角度值,用于控制爱心的左右移动,范围是 -π 到 π。self.speed
:随机生成爱心的速度,取值范围为 5 到 10。self.color
:爱心的颜色,这里是从colors
列表中随机选取颜色,虽然目前colors
列表只有'pink'
一个颜色,但可以方便未来扩展。self.outline
:爱心的外框线宽,默认值为 1。
6. move
方法
- 该方法控制爱心的位置更新和漂浮。
- 首先判断爱心是否在画布范围内 (
self.y <= 500
)。- 如果爱心仍在画布内,
self.y += self.speed
使爱心垂直方向上向下移动,self.x += self.speed * math.sin(self.f)
控制爱心在水平方向上的移动,self.f += 0.1
使得爱心的左右运动呈现正弦波状。 - 如果爱心超出了画布的下边界 (
self.y > 500
),则重新生成一个新的爱心对象,并将其初始位置设置为画布的上方。
- 如果爱心仍在画布内,
7. draw
方法
draw
方法负责使用turtle
绘制爱心形状。t.pensize(self.outline)
设置画笔的外框宽度。t.penup()
抬起画笔,移动到指定位置后再绘制。t.goto(self.x, self.y)
将画笔移动到当前爱心的随机位置。t.pendown()
放下画笔开始绘制。- 使用
begin_fill()
和end_fill()
方法填充爱心内部颜色为粉色。 - 通过
t.setheading(120)
设置画笔的初始角度,t.circle(self.r, 195)
画出爱心的两个半圆部分,t.fd(self.r * 2.4)
和t.left(90)
绘制爱心的底部。
8. 创建多个爱心对象
Hearts = [] # 用列表保存所有爱心
for i in range(100):Hearts.append(Heart())
Hearts
列表用于保存所有的爱心对象。通过for
循环,创建 100 个Heart
实例,并将其添加到Hearts
列表中。
9. 设置背景颜色
tu.bgcolor('black')
- 这行代码将画布的背景色设置为黑色,能让粉色的爱心更加突出。
10. 漂浮效果的实现
- 进入一个无限循环,模拟爱心漂浮的过程。
tu.tracer(0)
禁用画布的自动刷新,以提高性能,避免每次绘制都更新屏幕。t.clear()
清除当前的绘图,准备进行下一次绘制。- 使用
for i in range(50)
来控制当前绘制 50 个爱心对象。Hearts[i].move()
调用每个爱心的move
方法,使爱心根据随机属性移动。Hearts[i].draw()
绘制爱心。
tu.update()
刷新画布,显示更新后的图形。
11. 总结
这段代码通过定义 Heart
类,结合随机生成的属性和移动机制,使用 turtle
库绘制了一个动态的爱心飘浮效果。每个爱心都有随机的颜色、速度、位置和运动轨迹,模拟了爱心在画布上自由飘浮的效果。这种设计方法不仅实现了动态效果,还通过面向对象的设计,使得代码结构清晰易于扩展。
写在后面
我是一只有趣的兔子,感谢你的喜欢!