pygame的动图实现方法

最近在完善一个飞机大战的小游戏,一比一按照书上做出来的有些简陋,所以自己往里面加了不少元素。其中一项便是子弹的动态效果,但是pygame不支持gif的动图(可以导入,但不会动),那么该怎么办呢?

我们知道,动图的原理其实就是把一组图片快速播放。按照这个思路,我们可以试着把gif拆解成一张张的png,再将它们导入游戏快速轮换即可。

gif的拆解可以通过PS来完成,在CSDN上有不少教程,我也是从这里学到的,就不赘述了。关键的一步在于同时导入多张图片并轮流播放:

image_list = ['index0001', 'index0002', ...]
frame_list = []
    for i in image_list:
        ii = pygame.image.load(f'../images/gif/{i}.png')
        frame_list.append(ii)

上面是导入的代码。image_list里是你要导入的gif的每一帧的图片,有时候一个gif能够拆出几十张乃至上百张图片,我们肯定不可能把名字一个个手打进去。不过一般用PS拆解出来的png都会带有统一的名称前缀,如index0001,index0002等等。假设有60张图,用一个for循环可以轻松解决:

image_list = []
for i in range(0,61):
    name = f'index00{i}'
    image_list.append(name)
# 前十个数最后输出是index001,index002...少一个零,别忘记改

书接上文,通过又一个for循环将每个pygame.image.load()存储到frame_list列表里面,方便后续调用。图片轮换的代码如下:

self.images = image_list
self.image = self.images[0]
self.rect = self.image.get_rect()
self.image_index = 0

    def bullets_draw(self):
        """轮换"""
        if self.image_index < len(self.images) - 1:
            self.image_index += 1
        else:
            self.image_index = 0
        self.image = self.images[self.image_index]
        self.screen.blit(self.image, self.rect)

self.image设置一下第一帧,后面用一个image_index充当列表索引,以实现按顺序播放的效果。pygame绘制屏幕的速度很快,加载这些图片也就是一瞬间的事。

以上就是个人在初学pygame时的一点心得,希望能帮到有需要的人。毕竟我当时搜攻略搜了好久也没找到......