实现效果
介绍
本项目使用Python的Turtle库实现了一个简单的樱花树生成及花瓣飘落效果的动画。通过随机生成樱花树的枝干和颜色,以及在树枝上绘制樱花,并模拟樱花花瓣飘落的动画效果,展示了Turtle库在动画和图形绘制方面的应用。
环境配置
- Python版本: 3.x
- 需要的库: Turtle(Python标准库,无需额外安装)
项目分布
-
绘制树枝和樱花的函数定义
draw_branch(branch_len, angle, trunk_color)
: 绘制樱花树的分枝。draw_sakura(x, y)
: 绘制樱花的函数。
-
樱花飘落的类定义
Sakura
: 定义樱花对象,包括位置、颜色、大小等属性,并实现绘制和飘落的方法。
-
花瓣飘动效果的实现
petal_movement(sakura, petals)
: 实现花瓣飘动效果,通过Turtle对象模拟花瓣的飘落轨迹。
-
主函数及动画循环
main()
: 主函数,负责初始化画布、绘制樱花树、创建樱花对象和花瓣对象,并实现动画效果的循环播放。
详细代码
import turtle
import random
import math
# 设置画布
turtle.setup(width=800, height=600)
turtle.bgcolor("lightblue")
# 创建画笔
t = turtle.Turtle()
t.speed(0)
t.hideturtle()
t.width(2)
# 定义绘制树枝的函数
def draw_branch(branch_len, angle, trunk_color):
if branch_len > 10:
t.pensize(branch_len / 10)
t.color(trunk_color) # 设置树干颜色
t.forward(branch_len)
# 绘制樱花
draw_sakura(t.xcor(), t.ycor())
# 右侧树枝
right_angle = random.randint(15, 45)
right_length = random.uniform(0.6, 0.8) * branch_len
t.right(right_angle)
draw_branch(right_length, angle, trunk_color)
# 左侧树枝
left_angle = random.randint(15, 45)
left_length = random.uniform(0.6, 0.8) * branch_len
t.left(right_angle + left_angle)
draw_branch(left_length, angle, trunk_color)
# 返回到起始点
t.right(left_angle)
t.up()
t.backward(branch_len)
t.down()
# 定义绘制樱花的函数
def draw_sakura(x, y):
petal_color = random.choice(["pink", "lightpink", "hotpink", "deeppink"])
t.up()
t.goto(x, y)
t.down()
t.color("lightpink", petal_color)
t.begin_fill()
t.circle(random.uniform(3, 5))
t.end_fill()
# 定义樱花飘落的类
class Sakura:
def __init__(self, x, y):
self.x = x
self.y = y
self.dy = random.uniform(1, 2)
self.dx = random.uniform(-0.5, 0.5)
self.color = random.choice(["pink", "lightpink", "hotpink", "deeppink"])
self.size = random.randint(3, 10)
self.draw()
def draw(self):
t.up()
t.goto(self.x, self.y)
t.down()
t.color(self.color)
t.begin_fill()
t.circle(self.size)
t.end_fill()
def fall(self):
self.y -= self.dy
self.x += self.dx
# 随机飘动
self.x += math.sin(self.y / random.uniform(5, 15))
self.draw()
# 添加花瓣飘动的效果
def petal_movement(sakura, petals):
for petal in petals:
petal.penup()
petal.goto(sakura.x, sakura.y)
petal.pendown()
petal.color(sakura.color)
petal.speed(0)
angle = random.uniform(0, 360)
distance = random.uniform(50, 150)
petal.left(angle)
petal.forward(distance)
petal.right(90)
petal.forward(distance / 2)
petal.backward(distance / 2)
petal.left(180)
petal.forward(distance / 2)
petal.backward(distance / 2)
petal.right(90)
petal.forward(distance / 2)
petal.backward(distance / 2)
petal.left(180)
petal.forward(distance / 2)
petal.hideturtle()
# 主函数,绘制整棵樱花树和樱花飘落效果
def main():
t.up()
t.goto(0, -250)
t.down()
t.left(90)
trunk_color = "sienna"
t.color(trunk_color)
draw_branch(100, 65, trunk_color)
sakuras = []
petals = []
for _ in range(80):
x = random.randint(-400, 400)
y = random.randint(1, 150)
sakuras.append(Sakura(x, y))
petals += [turtle.Turtle() for _ in range(6)]
while True:
t.clear()
t.up()
t.goto(0, -250)
t.down()
t.left(90)
t.color(trunk_color)
draw_branch(100, 65, trunk_color)
for sakura in sakuras:
sakura.fall()
if sakura.y < -300:
sakura.y = random.randint(200, 300)
for sakura in sakuras:
petal_movement(sakura, petals)
turtle.update()
# 调用主函数
main()
# 显示完成的画布并保持显示
turtle.done()
总结
通过本项目,展示了如何使用Python中的Turtle库创建动画效果,具体实现了樱花树的生长和花瓣的飘落效果。通过调整参数和添加随机性,使得每次运行生成的樱花树和花瓣飘落轨迹都具有一定的随机性,增强了视觉上的动态感和真实感。这种项目既可以用于展示动画制作的基本原理,也可以作为学习Turtle库和随机数生成的一个有趣的例子。