当前位置: 首页 > news >正文

Python炫酷星空

3D星空

系列文章

序号直达链接
Tkinter
1Python李峋同款可写字版跳动的爱心
2Python跳动的双爱心
3Python蓝色跳动的爱心
4Python动漫烟花
5Python粒子烟花
Turtle
1Python满屏飘字
2Python蓝色流星雨
3Python金色流星雨
4Python漂浮爱心
5Python爱心光波①
6Python爱心光波②
7Python满天繁星
8Python五彩气球
9Python白色飘雪
10Python七彩花朵
11Python 3D星空
12Python大雪纷飞
13Python一闪一闪亮星星
14Python爱心泡泡
15Python爱心射线
16Python圣诞礼物
17Python礼物圣诞树
18Python浪漫星空
19Python飞舞蝙蝠
20Python万圣礼物
21Python蓝色飘雪
Pygame
1Python跨年烟花
2Python炫酷烟花
3Python黑客帝国字母雨
敬请期待……

写在前面

Python模拟3D星空动画的完整代码。

技术需求

  1. Python turtle

    • turtle库用于在屏幕上绘制图形和实现动画。通过Turtle对象,可以控制绘制的形状、位置、颜色等属性,并进行动态更新。
    • turtle库的主要功能包括创建图形、设置画笔颜色、填充颜色、控制对象的速度和位置,以及隐藏和显示图形等。
  2. Python random

    • random库用于生成随机数。在这段代码中,它被用来随机生成星星的位置、大小和移动速度,增加了动画的多样性和不可预测性。
    • 例如,使用ra.uniform(0, 1)生成一个0到1之间的浮动数,来控制星星的大小;使用ra.randint()来生成随机的整数,以确定星星的初始位置和速度。
  3. Turtle 对象的克隆

    • 通过turtle.clone()方法,克隆一个turtle对象,使每颗星星都拥有独立的属性(如位置、速度和大小)。每颗星星都是turtle对象的一个副本,因此它们可以独立地移动和变化。
  4. 循环控制

    • 使用while True:无限循环和for循环来不断更新每颗星星的位置,使动画持续运行。
    • 通过不断更新星星的位置来创建动态效果,并且当星星移出屏幕时,通过隐藏、重新设置位置并显示来实现星星的“循环出现”效果。
  5. 事件驱动模型

    • 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

这行代码导入了turtlerandom模块,分别用于绘制图形和生成随机数。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模块来增加随机性,使得每次运行时,星空的效果都不同,增强了互动性和趣味性。

写在后面

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

相关文章:

  • 使用Python调用DeepSeek的示例
  • 【项目】自主实现HTTP服务器:从Socket到CGI全流程解析
  • 报表控件stimulsoft教程:如何在报表和仪表板中创建热图
  • AQS 基本思想与源码分析
  • 【论信息系统项目的整合管理】
  • [基础] HPOP、SGP4与SDP4轨道传播模型深度解析与对比
  • 后端框架(3):Spring(2)
  • Oracle 批量操作脚本解析:动态执行与分批次删除
  • 项目班——0513——短信验证
  • 适合学校使用的桌面信息看板,具有倒计时、桌面时钟、课程表、天气预报、自动新闻联播、定时关机、消息通知栏、随机点名等功能。
  • PPT 转高精度 PDF API 接口
  • Spring循环依赖详解
  • Qt控件:交互控件
  • 分布式锁: Redisson 实现分布式锁的原理与技术细节
  • Transformer网络结构
  • 大数据技术的主要方向及其应用详解
  • 一台入网的电脑有6要素, 机器名,mac,ip,俺码,网关,dns,分别有什么作用
  • 【人工智能】大模型的成长日记:从训练到应用的全面蜕变
  • 经典案例 | 筑基与跃升:解码制造企业产供销协同难题
  • spring学习->sprintboot
  • 高途一季度净利润同比增长1108%: “与吴彦祖一起学英语”短时间内就实现了盈利
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 一图读懂丨创新创业人才最高补贴500万元!临港新片区发布创客新政“十二条”
  • 蒋圣龙突遭伤病出战世预赛存疑,国足生死战后防线严重减员
  • 最高人民法院、中国证监会联合发布《关于严格公正执法司法 服务保障资本市场高质量发展的指导意见》
  • 3年多来俄乌要首次直接对话?能谈得拢吗?