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时的一点心得,希望能帮到有需要的人。毕竟我当时搜攻略搜了好久也没找到......