在我想象中的流星雨应该是在闪烁星空下的,那么就对画面进行了基本构图。
![](https://i-blog.csdnimg.cn/blog_migrate/5cada17554ea776269dfc9981e9792a1.gif)
感觉最终实现的效果还是不错的,那么简单介绍一下如何再现这个模拟场景。
- 首先需要准备Python的IDE,这里我使用的是PyCharm
- 在PyCharm里需要安装PyGame库
- 最后进行代码编写就可以了
安装PyCharm的过程我就跳过了,CSDN上有相当多的大佬有更加专业且详细的教程。
如何安装PyGame库:
第一步:点击进入PyCharm,点击左上角的菜单栏的File,在下拉菜单中选中Settings。
![](https://i-blog.csdnimg.cn/blog_migrate/212cbc7365dcc89acf719db2a794d944.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3d42236f6580b56d9f3d27c71cfaeb0b.png)
第二步,弹出对话框,在对话框中选中Project: “your_project_name”(注意这里的your_project_name是你自己的项目名称)。
![](https://i-blog.csdnimg.cn/blog_migrate/0f9943bf067ec2c649df69e413629d48.png)
第三步,然后再点击Project Interpreter,进入对话框后点击“+”,在弹出的搜索栏中输入“PyGame”进行搜索。
![](https://i-blog.csdnimg.cn/blog_migrate/4aee6b473ccb4ccd48c07b68719d6a85.png)
第四步,在搜索结果中找到PyGame,然后点击左下角的install Package进行安装,安装成功后就可以使用PyGame进行愉快的玩耍了~(记得不要心急嗷,安装需要一点时间,成功之后会有提示的)
如果顺利完成以上内容,那么咱们就可以进入编程阶段了。
有几个可以DIY的部分着重展示一下:
可修改流星的部分:
self.x = random.randint(width//2, width) # 流星初始出现的横坐标范围
self.y = 0 # 流星初始出现的纵坐标
self.speed_x = random.uniform(-3, -4) # 流星横向的速度,负数表示向左
self.speed_y = random.uniform(2, 6) # 流星纵向的速度,正数表示向下
self.length = random.randint(5, 100) # 流星的长度
self.thickness = random.randint(1, 3) # 流星的粗细
self.color = (0,206,209) # 流星的颜色
可修改的星空的部分:
def __init__(self):
self.x = random.randint(0, width) # 星星出现的横坐标范围
self.y = random.randint(0, height) # 星星出现的纵坐标范围
self.size = random.randint(1, 3) # 星星的大小
self.color = (255, 255, 255) # 星星的颜色
另外星空的闪烁速度是独立控制的:
# 设置星空闪烁速度
star_blink_speed = 1
流星和星空的颜色都是可以修改的,可以查阅RGB的颜色库调整自己喜欢的颜色。
下面是完整的代码放送:
import pygame
import random
# 初始化pygame
pygame.init()
# 设置窗口大小
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
# 创建星空类
class Star:
def __init__(self):
self.x = random.randint(0, width) # 星星出现的横坐标范围
self.y = random.randint(0, height) # 星星出现的纵坐标范围
self.size = random.randint(1, 3) # 星星的大小
self.color = (255, 255, 255) # 星星的颜色
def draw(self):
pygame.draw.circle(screen, self.color, (self.x, self.y), self.size)
# 创建星空列表
stars = []
for i in range(100):
stars.append(Star())
# 创建流星类
class Meteor:
def __init__(self):
self.x = random.randint(width//2, width) # 流星初始出现的横坐标范围
self.y = 0 # 流星初始出现的纵坐标
self.speed_x = random.uniform(-3, -4) # 流星横向的速度,负数表示向左
self.speed_y = random.uniform(2, 6) # 流星纵向的速度,正数表示向下
self.length = random.randint(5, 100) # 流星的长度
self.thickness = random.randint(1, 3) # 流星的粗细
self.color = (0,206,209) # 流星的颜色
def draw(self):
pygame.draw.line(screen, self.color, (self.x, self.y), (self.x - self.length, self.y + self.length), self.thickness)
def move(self):
self.x += self.speed_x
self.y += self.speed_y
# 创建流星列表
meteors = []
# 设置星空闪烁速度
star_blink_speed = 1
# 游戏主循环
running = True
clock = pygame.time.Clock()
while running:
# 处理退出事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 绘制背景
screen.fill((0, 0, 0))
# 控制星空闪烁速度
if random.random() < star_blink_speed:
stars.append(Star())
if len(stars) > 200:
stars.pop(0)
# 绘制星空
for star in stars:
star.draw()
# 创建新的流星
if random.random() < 0.02:
meteors.append(Meteor())
# 绘制并移动流星
for meteor in meteors:
meteor.move()
meteor.draw()
if meteor.x < -meteor.length or meteor.y > height + meteor.length: # 流星完全离开屏幕后移除
meteors.remove(meteor)
# 刷新屏幕
pygame.display.flip()
# 控制帧率
clock.tick(165)
# 退出游戏
pygame.quit()
祝愿各位小伙伴都能顺利看到属于自己的流星雨!