金色流星雨

系列目录

环境需求

  • python3.11.4
  • PyCharm Community Edition 2023.2.5
  • pyinstaller6.2.0可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)

【注】

完整代码

import turtle  # 导入turtle库,用于图形绘制
import random  # 导入random库,生成随机数
import math  # 导入math库,进行数学计算

turtle.setup(1.0, 1.0)  # 设置窗口大小为屏幕大小
turtle.title("流星雨动画")   # 设置窗口标题
turtle.bgcolor('black')  # 设置背景颜色为黑色

t = turtle.Turtle()  # 创建一个画笔对象
t.hideturtle()  # 隐藏画笔,不显示画布的形状
t.pensize(1)    # 设置画笔的大小

# 定义流星的颜色列表
colors = ['gold', 'yellow', 'orange']  # 金色


class Meteor:  # 定义流星类
    def __init__(self):  # 初始化方法,创建每颗流星时调用
        self.r = random.randint(50, 100)    # 随机生成流星的半径
        self.k = random.uniform(2, 4)   # 随机生成角度参数
        self.x = random.randint(-1000, 1000)  # 随机生成流星的x坐标
        self.y = random.randint(-500, 500)  # 随机生成流星的y坐标
        self.speed = random.randint(5, 10)  # 随机生成流星的移动速度
        self.color = random.choice(colors)  # 随机选择流星的颜色

    def meteor(self):  # 绘制流星的方法
        # 移动画笔到指定的坐标位置处
        t.penup()
        t.goto(self.x, self.y)
        t.pendown()
        # 设置流星的颜色
        t.begin_fill()
        t.fillcolor(self.color)
        # 开始绘制流星
        t.setheading(-30)  # 设置流星的朝向
        t.right(self.k)  # 根据随机角度右转
        t.forward(self.r)  # 沿直线前进一定长度
        t.left(self.k)  # 左转回到垂直方向
        t.circle(self.r * math.sin(math.radians(self.k)), 180)  # 绘制半圆弧
        t.left(self.k)  # 再次左转恢复角度
        t.forward(self.r)  # 沿直线前进相同长度以闭合流星形状
        t.end_fill()  # 结束填充

    def move(self):  # 更新流星位置的方法
        if self.y >= -500:  # 当流星的y坐标大于等于-500时
            self.y -= self.speed  # 减小流星y坐标的大小,将画笔向下移动
            self.x += 2 * self.speed  # 增加流星x坐标的大小,将画笔向右移动
        else:  # 当流星的y坐标小于-500时
            self.r = random.randint(50, 100)  # 重新设置流星的半径
            self.k = random.uniform(2, 4)  # 重新设置角度参数
            self.x = random.randint(-2000, 1000)  # 重新设置流星的x坐标
            self.y = 500  # 重新设置流星的y坐标
            self.speed = random.randint(5, 10)  # 重新设置流星的速度
            self.color = random.choice(colors)  # 重新设置流星的颜色


# 创建一个流星列表,用来存储流星实例
Meteors = []
for i in range(100):
    Meteors.append(Meteor())

# 进行无限循环,模拟流星雨动画
while True:
    turtle.tracer(0)  # 关闭tracer,提高性能
    t.clear()  # 清除画布内容
    for i in range(100):
        Meteors[i].move()  # 更新每颗流星的位置
        Meteors[i].meteor()  # 重新绘制每颗流星
    turtle.update()  # 更新屏幕显示内容

代码分析

这段代码实现了一个流星雨动画效果,利用Python的turtle库绘制流星,结合random库生成流星的随机参数,实现动态的流星雨效果。下面对代码进行详细分析。

1. 导入库和窗口设置

import turtle  # 导入turtle库,用于图形绘制
import random  # 导入random库,生成随机数
import math  # 导入math库,进行数学计算

代码首先导入了turtle库用于绘制图形、random库用于生成随机数和参数,math库用于数学计算。接下来进行窗口的设置:

turtle.setup(1.0, 1.0)  # 设置窗口大小为屏幕大小
turtle.title("流星雨动画")   # 设置窗口标题
turtle.bgcolor('black')  # 设置背景颜色为黑色

这里设置了窗口大小为全屏,背景颜色为黑色,且窗口标题为“流星雨动画”,营造夜空效果。

2. 创建画笔对象

t = turtle.Turtle()  # 创建一个画笔对象
t.hideturtle()  # 隐藏画笔,不显示画布的形状
t.pensize(1)    # 设置画笔的大小

Turtle类的实例t用于绘制流星。通过t.hideturtle()隐藏画笔,使绘制过程更流畅不受画笔形状影响。pensize(1)设置了画笔的粗细为1。

3. 流星的颜色

colors = ['gold', 'yellow', 'orange']  # 金色

定义了流星的颜色列表colors,包含了金色、黄色和橙色,以便后续随机选择,模拟流星燃烧时的颜色。

4. 定义流星类Meteor

class Meteor:
    def __init__(self):
        self.r = random.randint(50, 100)    # 随机生成流星的半径
        self.k = random.uniform(2, 4)   # 随机生成角度参数
        self.x = random.randint(-1000, 1000)  # 随机生成流星的x坐标
        self.y = random.randint(-500, 500)  # 随机生成流星的y坐标
        self.speed = random.randint(5, 10)  # 随机生成流星的移动速度
        self.color = random.choice(colors)  # 随机选择流星的颜色

Meteor类用于定义每个流星的属性和行为。初始化方法__init__()随机生成每颗流星的初始参数:

  • r:流星的半径,控制其大小,范围为50到100。
  • k:角度参数,随机选取的角度用于流星轨迹的倾斜。
  • xy:流星的起始位置坐标,范围为屏幕的水平和垂直方向上适合的区间。
  • speed:流星的速度控制其下落和横向运动的速度,值为5到10之间。
  • color:随机选取流星颜色,使流星颜色丰富多样。

5. meteor方法:绘制流星

def meteor(self):
    t.penup()
    t.goto(self.x, self.y)
    t.pendown()
    t.begin_fill()
    t.fillcolor(self.color)
    t.setheading(-30)  # 设置流星的朝向
    t.right(self.k)
    t.forward(self.r)
    t.left(self.k)
    t.circle(self.r * math.sin(math.radians(self.k)), 180)
    t.left(self.k)
    t.forward(self.r)
    t.end_fill()

该方法绘制每个流星的形状和轨迹:

  • penup()goto(self.x, self.y):移动到流星的位置。
  • pendown():开始绘制。
  • begin_fill()fillcolor(self.color):设置填充颜色和开启填充模式。
  • setheading(-30):设置流星朝向的角度,模拟流星在天空中的倾斜。
  • right(self.k)left(self.k):根据随机角度参数k进行左右旋转,增加轨迹的多样性。
  • forward(self.r):沿直线前进,使流星呈现一个尾巴效果。
  • circle():绘制半圆弧形。
  • end_fill():结束填充,形成完整流星形状。

6. move方法:流星的运动

def move(self):
    if self.y >= -500:
        self.y -= self.speed  # 将画笔向下移动
        self.x += 2 * self.speed  # 向右移动
    else:
        self.r = random.randint(50, 100)
        self.k = random.uniform(2, 4)
        self.x = random.randint(-2000, 1000)
        self.y = 500
        self.speed = random.randint(5, 10)
        self.color = random.choice(colors)

该方法更新流星的位置,形成连续下落的动态效果。条件判断if self.y >= -500控制流星的位置更新,避免流星超出屏幕范围。

  • self.y -= self.speedself.x += 2 * self.speed:分别使流星向下和向右移动,模拟流星运动。
  • 否则,表示流星已出界,将其属性随机重置,使其从屏幕顶部重新出现。

7. 创建流星对象列表

Meteors = []
for i in range(100):
    Meteors.append(Meteor())

通过循环创建100个流星对象并存储在列表Meteors中,以便在后续的动画循环中调用,形成流星雨效果。

8. 动画循环

while True:
    turtle.tracer(0)  # 关闭tracer,提高性能
    t.clear()  # 清除画布内容
    for i in range(100):
        Meteors[i].move()  # 更新每颗流星的位置
        Meteors[i].meteor()  # 重新绘制每颗流星
    turtle.update()  # 更新屏幕显示内容

动画的主要逻辑在while True循环中实现:

  • turtle.tracer(0):关闭追踪,减少动画刷新,提高效率。
  • t.clear():每次循环清空画布,避免重影。
  • 循环遍历Meteors列表,调用movemeteor方法分别更新和绘制每颗流星的位置。
  • turtle.update():刷新屏幕,显示最新的流星位置和形状。

总结

该代码通过Meteor类定义了流星的随机属性、绘制方式和运动逻辑,利用turtle的动画特性生成了流星雨效果。每颗流星都有独立的颜色、尺寸和轨迹,使流星雨动画生动,营造出动态的夜空氛围。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部