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模拟3D星空动画的完整代码。
技术需求
-
Python
turtle
库:turtle
库用于在屏幕上绘制图形和实现动画。通过Turtle
对象,可以控制绘制的形状、位置、颜色等属性,并进行动态更新。turtle
库的主要功能包括创建图形、设置画笔颜色、填充颜色、控制对象的速度和位置,以及隐藏和显示图形等。
-
Python
random
库:random
库用于生成随机数。在这段代码中,它被用来随机生成星星的位置、大小和移动速度,增加了动画的多样性和不可预测性。- 例如,使用
ra.uniform(0, 1)
生成一个0到1之间的浮动数,来控制星星的大小;使用ra.randint()
来生成随机的整数,以确定星星的初始位置和速度。
-
Turtle
对象的克隆:- 通过
turtle.clone()
方法,克隆一个turtle
对象,使每颗星星都拥有独立的属性(如位置、速度和大小)。每颗星星都是turtle
对象的一个副本,因此它们可以独立地移动和变化。
- 通过
-
循环控制:
- 使用
while True:
无限循环和for
循环来不断更新每颗星星的位置,使动画持续运行。 - 通过不断更新星星的位置来创建动态效果,并且当星星移出屏幕时,通过隐藏、重新设置位置并显示来实现星星的“循环出现”效果。
- 使用
-
事件驱动模型:
tu.mainloop()
启动了事件循环,保持图形窗口的持续显示和交互。这是turtle
库和其他图形库常用的机制,用来让程序持续运行,直到用户关闭窗口。
完整代码
import turtle as tu
import random as ra
width, height = 800, 600
tu.setup(width, height)
tu.title("3D星空")
tu.bgcolor("black")
tu.delay(0)
t=tu.Turtle(visible=False,shape='circle')
t.pencolor("white")
t.fillcolor("white")
t.penup()
stars = []
……
代码分析
这段代码使用Python的turtle
库创建了一个简单的3D星空动画效果,模拟了在黑暗背景上移动的星星。星星会随机生成,并且向左移动,当其移出屏幕时会重新出现在屏幕的右侧,从而形成一个连续的动态效果。代码的主要流程包括窗口设置、星星生成、星星移动和循环刷新。接下来,我将详细分析每个部分的功能及实现。
1. 导入库
import turtle as tu
import random as ra
这行代码导入了turtle
和random
模块,分别用于绘制图形和生成随机数。turtle
库是Python自带的一个图形绘制库,常用于绘制各种图形和动画。random
库则用于生成随机数,这在本代码中用于随机生成星星的位置、大小和移动速度。
2. 设置窗口尺寸和背景
width, height = 800, 600
tu.setup(width, height)
tu.title("3D星空")
tu.bgcolor("black")
tu.delay(0)
width, height = 800, 600
:定义了绘图窗口的宽度和高度为800x600像素。tu.setup(width, height)
:设置绘图窗口的尺寸,宽度为800像素,高度为600像素。tu.title("3D星空")
:设置窗口的标题为"3D星空"。tu.bgcolor("black")
:设置窗口的背景色为黑色,这为星空提供了背景。tu.delay(0)
:设置绘制的延迟为0,即关闭动画延迟,让图形的绘制过程尽量流畅。
3. 创建turtle对象
t = tu.Turtle(visible=False, shape='circle')
t.pencolor("white")
t.fillcolor("white")
t.penup()
这段代码创建了一个turtle
对象t
,用于绘制星星。具体细节如下:
tu.Turtle(visible=False, shape='circle')
:创建一个形状为圆形、初始状态不可见的turtle
对象。星星将由这个turtle
对象的克隆来表示。t.pencolor("white")
:设置画笔颜色为白色,因为星星在黑色背景上应该是白色的。t.fillcolor("white")
:设置填充颜色为白色,虽然在这段代码中没有使用填充,但它定义了默认的颜色。t.penup()
:提升画笔,防止在移动过程中留下痕迹。
4. 创建星星
这部分代码用于生成99颗星星,每颗星星通过克隆t
对象来创建。分析如下:
stars = []
:创建一个空的列表stars
,用于存储所有的星星对象。for i in range(99):
:循环99次,生成99颗星星。star = t.clone()
:通过clone()
方法克隆一个turtle
对象,每颗星星都将是t
对象的一个独立副本。每颗星星都是一个turtle
对象,因此可以独立移动。s = ra.uniform(0, 1) / 3
:生成一个0到1之间的随机数,并除以3,得到一个较小的值,作为星星的大小比例。shapesize(s, s)
将星星的大小设置为这个比例,使星星看起来具有不同的尺寸。star.shapesize(s, s)
:设置星星的形状大小,使得每颗星星的尺寸不同。star.speed(ra.randint(2, 5))
:设置星星的移动速度为一个2到5之间的随机整数。turtle
的速度决定了星星的移动速度,数字越小,星星越快。star.setx(ra.randint(width//2, width))
:将星星的x坐标设置为从屏幕右侧开始的随机位置。ra.randint(width//2, width)
生成一个位于屏幕右半部分的随机x坐标。star.sety(ra.randint(-height//2, height//2))
:将星星的y坐标设置为一个在屏幕上下方向上的随机位置。ra.randint(-height//2, height//2)
生成一个在窗口上下范围内的随机y坐标。star.showturtle()
:显示克隆出来的星星,初始时它是不可见的。stars.append(star)
:将新创建的星星添加到stars
列表中,方便后续进行移动操作。
5. 星星的运动与循环
这部分代码实现了星星的不断移动,并且当星星移出屏幕时,它会重新出现在屏幕右侧。具体实现细节如下:
while True:
:使用无限循环,使得星星的运动不断进行。for star in stars:
:遍历stars
列表中的所有星星对象,每次循环处理一颗星星的移动。star.setx(star.xcor() - star.speed())
:通过xcor()
获取星星的当前x坐标,然后减去星星的速度,从而使星星向左移动。每颗星星的速度是随机的,因此它们的移动速度不同。if star.xcor() < -width//2:
:判断星星的x坐标是否小于窗口左侧的边界。如果是,说明星星已经离开屏幕的左侧。star.hideturtle()
:将星星隐藏,因为它需要重新生成位置。star.setx(ra.randint(width//2, width))
:将星星的x坐标重置为屏幕右侧的随机位置,即让星星从右侧重新出现。star.sety(ra.randint(-height//2, height//2))
:将星星的y坐标重置为一个新的随机值,使得星星的纵向位置也发生变化。star.showturtle()
:重新显示星星,使它再次出现在屏幕上。
6. 主循环
tu.mainloop()
启动turtle
的主事件循环,保持图形窗口的持续显示。所有的图形绘制和动画效果都会在这个循环中持续进行。
7. 总结
通过这段代码,作者创建了一个简单而有趣的星空动画效果。每颗星星具有不同的大小、速度和初始位置,并且随着时间的推移,它们会不断地从右侧进入、向左移动并离开屏幕,形成了一个动态的星空效果。通过使用turtle
库的克隆功能,代码实现了星星的生成和移动,使得每颗星星都是独立的个体,可以自由地在屏幕上移动。整体代码结构简单清晰,使用了random
模块来增加随机性,使得每次运行时,星空的效果都不同,增强了互动性和趣味性。
写在后面
我是一只有趣的兔子,感谢你的喜欢!