python画出《雪景》的效果

欢迎加入我们卧虎藏龙的python讨论qq群:729683466

导 语 ●

冬天到了

我们用python模拟一下雪景

顺便学习一下python的图像处理

以及其中的图片连帧变化

学一下这个

对写游戏很有帮助

其中用到的很多方法都是一样的。

代码及相关资源获取

1:关注“python趣味爱好者”公众号,回复“雪景 ”获取源代码

  

效果演示

ss

往期精选

我们的《2小时python不挂科》录制好啦

求解“背包问题”的“粒子群算法”

 ????

开发工具

python3.6.4

用到的第三方库:pygame random os PIL

讲解部分

一:动态雪景原理

所谓制作动态雪景,就像大家在视频里看到的那样,在一个背景图中,模拟雪花由上到下飘落,我们看看背景图。我们就是在这个背景图上画雪花。然后快速移动位置。

雪花也是一个图片,我们可以动态调节不同位置的雪花的大小,模拟出雪花远近。

模拟过程和普通的游戏帧率变化一样。每间隔一个帧率的时间,让雪花向下方移动一小段。其中,这个雪花也旋转一定的角度。然后刷新一下视频,由于视觉暂留的作用,呈现在我们眼前的就是视频一样的雪景。

二:雪花的运动

首先载入雪花图片和背景图片。

snow_image = pygame.image.load_extended('snow.png')

用pygame里面的image.load_extend()函数载入。同理,背景图片也可以这样处理。

因为不同的雪花速度,大小以及位置都是不同的,所以我们要定义一个雪花的类来表示这些雪花。其中包含有这些参数。

其中先定义一些基本的变量,如雪花的速度,位置,尺寸。例如:self.speed代表这个雪花的速度。在实例化的时候,speed是我们放进去的实参。

    def __init__(self, image, pos, speed, size, screen):
        super().__init__()
        self.screen = screen
        self.speed= speed
        self.pos = pos
        self.image = pygame.transform.scale(image, size)
        self.rect = self.image.get_rect()
        self.rect.x = pos[0]
        self.rect.y = pos[1]

然后,这雪花的类中,我们定义几个重要的函数。比如雪花运动的函数。

    def update(self):
        self.rect.x += self.speed[0]
        self.rect.y += self.speed[1]


        # 雪花旋转
        self.image = pygame.transform.rotate(self.image, 90)
        if self.check_edges():
            self.rect.x = self.pos[0]
            self.rect.y = self.pos[1]

其中第一部分就是按照雪花的速度,修改雪花的位置,具体来说就是修改雪花的x坐标和y坐标。第二部分就是雪花本身的自我旋转,这同样也是修改了雪花的x坐标和y坐标。

雪花数量很多,我们可以定义一个snow_group = Group(),专门用来存储实例化以后的雪花。在其中添加雪花。

 snow_group.add(Snow(snow_image, pos, speed, snow_size, screen))

三:雪花飘落的控制

雪花飘落的控制,实际上用的就是一个while循环。现在screen背景上填充我们的背景图片。

screen.blit(bg, (0, 0))

然后进行雪花的控制,也就是控制雪花的飘落。用到的函数就是下面的函数。

        for snow in snow_group.copy():
            snow.blitme()

修改雪花的位置后,修改雪花的集合,这样才能正常的产生新的雪花并且添加到groups里面。代码如下

snow_group.update()

这些基本操作完成以后,我们还需要刷新一下界面,只有这样,雪花才能在图片上正常移动。

pygame.display.update()

在while循环的最后,我们需要设置一个时钟,用来控制帧率也就是控制这个while循环的速度,这样雪花就可以平缓飘落。

        # 设置fps
        clock.tick(30)
        if num >= 250:
            break
        num += 1

最后:

大家可以试试给代码加上背景音乐,看雪景的时候听音乐岂不是更好?

作者|齐

编辑|齐

感谢大家观看

有钱的老板可打赏一下小编哦

扫描二维码

关注我们

QQ群:729683466

◰  

参考来源

代码作者:PerpetualSmile

封面来源:图怪兽

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值