Python动态星空
系列文章
序号 | 直达链接 |
---|---|
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绘制一个含有月亮、流星、星星的炫酷星空的完整代码。
技术需求
-
Python 标准库:
turtle
: 用于绘图和动画,通过控制画笔进行图形绘制和动态更新画布,创建了星星、流星和月亮的动画效果。math
: 用于数学计算,特别是计算流星的轨迹,使用math.sin()
来控制流星的路径。random
: 用于生成随机数,随机化星星和流星的位置、大小、颜色和移动速度,增强动画的多样性和动态效果。-
面向对象编程:定义了一个
Star
类来封装星星、流星和月亮的属性和行为,使得每个天体可以单独控制其位置、颜色、大小、速度等,并通过move()
、star1()
、star2()
等方法实现其动态效果。 -
动态动画:
- 使用
turtle
的penup()
和pendown()
控制画笔的绘制和移动,实现元素的绘制和更新。 - 通过
tu.tracer(0)
和tu.update()
控制画面刷新,避免每次绘制都自动更新,从而提高动画效率。 - 利用无限循环
while True
来持续更新画面,保持动态效果。 -
随机化:
random.randint()
和random.choice()
被广泛应用于生成随机数和随机选择颜色,为每个天体生成不同的初始位置、大小、颜色和速度,使得每次动画播放的效果都不相同,增加了视觉上的多样性。 -
图形绘制与填充:
- 使用
turtle
的begin_fill()
和end_fill()
方法实现图形的填充效果,如月亮和星星的填充颜色。 - 利用
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
: 流星的角度,用于控制流星的轨迹形状。moon()
: 该方法负责绘制月亮。月亮是一个黄色的圆形,通过t.circle(66)
绘制一个半径为 66 的圆,并使用begin_fill()
和end_fill()
来填充颜色。star1()
: 该方法绘制星星。星星是一个五角星,绘制时使用了一个循环来完成五个边的绘制。星星的颜色和大小是随机的。star2()
: 该方法绘制流星。流星的轨迹是通过forward()
和circle()
方法控制的,使流星呈现弯曲的轨迹。流星的颜色和大小也都是随机生成的。move()
: 该方法负责更新天体的位置。月亮、星星和流星的运动速度和方向都在这个方法中更新。具体来说:- 月亮会从左到右移动,当其位置超出画布范围时,重新设置为初始位置。
- 星星会根据随机速度和颜色在画布上移动,超出画布后重新生成新的星星。
- 流星会随机在画布上移动,超出画布时重新生成新的流星。
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
,其纵向位置固定,因此看起来是横向运动。x3
和 y3
的变化同时影响流星的位置,给人一种快速下落的感觉。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