系列文章

序号 直达链接
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绘制一个含有月亮、流星、星星的炫酷星空的完整代码。

技术需求

  1. Python 标准库:

  2. turtle: 用于绘图和动画,通过控制画笔进行图形绘制和动态更新画布,创建了星星、流星和月亮的动画效果。
  3. math: 用于数学计算,特别是计算流星的轨迹,使用 math.sin() 来控制流星的路径。
  4. random: 用于生成随机数,随机化星星和流星的位置、大小、颜色和移动速度,增强动画的多样性和动态效果。
  5. 面向对象编程:定义了一个 Star 类来封装星星、流星和月亮的属性和行为,使得每个天体可以单独控制其位置、颜色、大小、速度等,并通过 move()star1()star2() 等方法实现其动态效果。

  6. 动态动画:

  7. 使用 turtlepenup()pendown() 控制画笔的绘制和移动,实现元素的绘制和更新。
  8. 通过 tu.tracer(0)tu.update() 控制画面刷新,避免每次绘制都自动更新,从而提高动画效率。
  9. 利用无限循环 while True 来持续更新画面,保持动态效果。
  10. 随机化:random.randint()random.choice() 被广泛应用于生成随机数和随机选择颜色,为每个天体生成不同的初始位置、大小、颜色和速度,使得每次动画播放的效果都不相同,增加了视觉上的多样性。

  11. 图形绘制与填充:

  12. 使用 turtlebegin_fill()end_fill() 方法实现图形的填充效果,如月亮和星星的填充颜色。
  13. 利用 turtle.circle()turtle.forward() 等基本绘图方法绘制圆形、星形、流星轨迹等。

完整代码

import math
import turtle as tu
import random as ra

tu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)  # 设置画布大小
tu.bgcolor('black')  # 设置画布颜色
t = tu.Pen()
t.ht()  # 隐藏画笔
colors2 = ['yellow', 'gold', 'orange']    # 星星的颜色列表
colors3 = ['skyblue', 'white', 'cyan', 'aqua']  # 流星的颜色列表

class Star():  # 流星类
    def __init__(self):
        self.x1 = -850
        self.y1 = 300
        self.x2 = ra.randint(-1500, 1000)  # 星星的横坐标
        self.y2 = ra.randint(-500, 500)  # 星星的纵坐标
        self.r2 = ra.randint(1, 5)
        self.x3 = ra.randint(-1500, 1000)  # 流星的横坐标
        self.y3 = ra.randint(-500, 500)  # 流星的纵坐标
        self.r3 = ra.randint(50, 100)  # 流星的半径
        self.t = ra.randint(1, 3)
        self.speed2 = ra.randint(1, 3)  # 星星流星移动速度
        self.speed3 = ra.randint(10, 15)  # 流星的移动速度
        self.color2 = ra.choice(colors2)  # 星星的颜色
        self.color3 = ra.choice(colors3)  # 流星的颜色

    def moon(self):   # 画月亮
        t.penup()
        t.goto(self.x1, self.y1)
        t.pendown()
        t.pencolor("yellow")
        t.begin_fill()
        t.fillcolor("gold")
        t.circle(66)
        t.end_fill()

    def star1(self):  # 画星星的函数
        t.pensize(1)  # 设置画笔大小
        t.penup()  # 提笔
        t.goto(self.x2, self.y2)  # 设置星星在画布中的初始坐标
        t.pendown()  # 落笔
        t.speed(0)  # 画星星的速度,范围为0~10(0最快)
        t.color(self.color2)  # 设置星星的外框颜色
        t.begin_fill()  # 开始填色
        t.fillcolor(self.color2)  # 星星的内部颜色
        for i in range(5):  # 循环画星星
            t.forward(self.r2)
            t.right(144)
            t.forward(self.r2)
            t.left(72)
        t.end_fill()  # 结束填充颜色
……

代码分析

这段代码通过使用 Python 的 turtle 库绘制了一个包含月亮、星星和流星的动态场景。整个程序的核心思想是利用 turtle 模块的绘图功能以及随机生成坐标、颜色和速度的方式,使得这些天体元素在屏幕上动起来。代码通过创建一个 Star 类来表示每个星星、流星以及月亮,类中的方法用于绘制和更新这些图形的显示,接下来将从多个方面详细分析这段代码。

1. 库的引入

代码首先引入了三个标准库:

  • math: 主要用于数学运算,这里用于计算与流星轨迹相关的正弦值。
  • turtle: 用于绘图,turtle 是 Python 的一个标准库,提供了画笔控制、图形绘制等功能。
  • random: 用于生成随机数,星星和流星的位置、颜色、大小和速度都依赖于 random 模块的生成。
  • 2. 初始化画布

    tu.setup(1.0, 1.0)
    tu.screensize(1.0, 1.0)  # 设置画布大小
    tu.bgcolor('black')  # 设置画布颜色
    

    通过 tu.setup(1.0, 1.0) 来设置画布为全屏(1.0 表示屏幕宽高的百分比),tu.screensize(1.0, 1.0) 进一步确保画布大小适应屏幕,tu.bgcolor('black') 将背景色设置为黑色,模拟夜空的效果。

    3. Star 类的定义

    Star 类定义了星星、流星和月亮的属性和行为。这个类中的每个实例代表一个星星或流星,具有以下几个重要属性:

  • 属性
  • x1, y1: 月亮的初始位置。
  • x2, y2: 星星的初始位置。
  • x3, y3: 流星的初始位置。
  • r2, r3: 星星和流星的大小。
  • speed2, speed3: 星星和流星的移动速度。
  • color2, color3: 星星和流星的颜色。
  • t: 流星的角度,用于控制流星的轨迹形状。
  • 方法
    1. moon(): 该方法负责绘制月亮。月亮是一个黄色的圆形,通过 t.circle(66) 绘制一个半径为 66 的圆,并使用 begin_fill()end_fill() 来填充颜色。
    2. star1(): 该方法绘制星星。星星是一个五角星,绘制时使用了一个循环来完成五个边的绘制。星星的颜色和大小是随机的。
    3. star2(): 该方法绘制流星。流星的轨迹是通过 forward()circle() 方法控制的,使流星呈现弯曲的轨迹。流星的颜色和大小也都是随机生成的。
    4. move(): 该方法负责更新天体的位置。月亮、星星和流星的运动速度和方向都在这个方法中更新。具体来说:
    5. 月亮会从左到右移动,当其位置超出画布范围时,重新设置为初始位置。
    6. 星星会根据随机速度和颜色在画布上移动,超出画布后重新生成新的星星。
    7. 流星会随机在画布上移动,超出画布时重新生成新的流星。
  • 4. 动态效果的实现

    整个程序通过一个无限循环 (while True) 来持续更新天体的位置和状态:

    while True:
        tu.tracer(0)
        t.clear()
        Stars[0].moon()
        for i in range(99):
            Stars[i].move()
            Stars[i].star1()
        for i in range(19):
            Stars[i].star2()
        tu.update()
    
  • tu.tracer(0) 关闭了 turtle 的自动刷新功能,这样可以通过手动更新画面来提高绘制速度。
  • t.clear() 每次绘制前清除画布,防止上一次的图形残留。
  • Stars[0].moon() 绘制月亮。
  • for i in range(99) 绘制99颗星星,并调用它们的 move()star1() 方法来更新星星的位置。
  • for i in range(19) 绘制19颗流星,并调用它们的 move()star2() 方法来更新流星的位置。
  • tu.update() 手动刷新画面,显示最新的天体位置。
  • 5. 星星和流星的运动逻辑

    星星和流星的运动是通过更新它们的坐标来实现的。星星和流星的移动都包括左右或上下方向的随机速度。这些速度会影响它们在画布上的移动效果:

  • 星星的横向移动速度为 2 * speed2,其纵向位置固定,因此看起来是横向运动。
  • 流星的速度较大,x3y3 的变化同时影响流星的位置,给人一种快速下落的感觉。
  • 6. 使用 random 实现动态效果

    在每次循环中,星星和流星的初始位置、大小、颜色和速度都是通过 random 模块生成的。这样就能确保每次生成的星星和流星都是不同的,使得整个场景更具有动态性和多样性。

  • self.x2 = ra.randint(-1500, 1000)self.y2 = ra.randint(-500, 500) 使得星星的初始位置随机分布在画布上。
  • self.speed2 = ra.randint(1, 3)self.speed3 = ra.randint(10, 15) 随机生成星星和流星的速度,保证每个天体的运动速度不同。
  • self.color2 = ra.choice(colors2)self.color3 = ra.choice(colors3) 随机选择星星和流星的颜色,使得整个动画更加丰富。
  • 7. 性能优化

  • 使用 tu.tracer(0)tu.update() 来控制画面刷新速度,避免每次绘制都立刻更新,这样可以提高效率,尤其是在动画中。
  • t.clear() 每次绘制之前清空画布,避免残影。
  • 8. 总结

    这段代码使用 turtle 库成功地创建了一个动态的星空场景,展示了如何通过类和方法管理和控制多个天体的状态。通过随机化天体的属性,增加了动画的多样性和趣味性。虽然目前该程序比较简单,但其灵活性和可扩展性为进一步增加功能和细节提供了良好的基础。

    写在后面

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

    作者:Want595

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python动态星空

    发表回复