《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1

多张序列帧指的是每一帧是一张单独的图片,如图1所示。

图1 多张序列帧

连续显示这些序列帧,就可以实现动画效果,如图2所示。

图2 动画效果

1 构造多帧图片的文件名列表

通过多张帧序列显示动画,就需要将这些帧序列图片都导入到程序中。因此,需要将这些图片名放到列表中,以便使用。从图1中可以看出,每张序列帧的名字都是以“BucketheadZombie_数字.png”的格式命名的,因此,可以通过图3所示的代码将图片名放入到列表中。

图3 将图片名放入到列表中的代码

以上代码通过列表推导式,将图片名放入到列表中,这些帧图片都保存在“BucketheadZombie”文件夹中。imagepath_list中的元素如图4所示。

图4 imagepath_list中的元素

相关链接1 列表推导式的相关知识,请参考《Python中List推导式的使用方法》

2 修改MySprite类的__init__()方法

显示动画效果,实际上就是实现序列帧的切换显示。通过MySprite类的时间属性控制序列帧的切换,代码如图5所示。

图5 __init__()函数的代码

其中,第26-28行代码与《《pygame中Sprite类实现多帧动画》注-显示静态图片2-1》中相同;第29-30行定义的current_time和last_time表示当前时间和显示当前帧的时间,第31行定义的current_frame表示显示的当前帧图片,如图6所示。

图6 时间属性示意图

从图6的左边向右边看,当current_time-last_time的值超过某个阈值speed时,说明当前帧图片current_frame已经显示了足够长的时间,该换下一张帧图片了,此时current_frame加1,表示显示下一张帧图片,然后last_time的值变为current_frame,重新获取current_frame的值为当前时间值。如此循环下去,完成帧图片的连续显示。

### 如何在 Pygame 中创建和控制逐动画 #### 创建逐动画的基础概念 逐动画通过连续显示一系列静态图像来创建动画效果[^4]。为了实现这一目标,在 Pygame 中通常会利用 `Sprite` 及其子化对象,这些对象能够存储个表示不同状态的图像,并可以在特定时刻更新自身的图像属性。 #### 自定义精灵 (Sprite) 用于动画 自定义一个继承自 `pygame.sprite.Sprite` 的,该内部维护着一组代表各个动作阶段的画面序列——即由若干个尺寸一致却描绘了角色不同姿态的位图所构成的一个列表。每当调用此精灵实例的方法去刷新其外观时,便会依据程序计数器或时间戳选取下一个要展示的画面并赋值给 `self.image` 成员变量,从而达到视觉上连贯的动作变化效果[^3]。 ```python import pygame from itertools import cycle class AnimatedSprite(pygame.sprite.Sprite): def __init__(self, position, images): super().__init__() self.images = images # 存储所有的列表 self.index = 0 # 当前索引 self.animation_cycle = cycle(self.images) self.image = next(self.animation_cycle) self.rect = self.image.get_rect(center=position) self.animation_time = 0.1 # 切换至下一所需秒数 self.current_time = 0 # 记录经过了少时间 def update(self, dt): # 更新函数接收 delta time 参数 if self.index >= len(self.images)-1: self.index = -1 # 循环播放 self.current_time += dt if self.current_time >= self.animation_time: self.current_time = 0 self.index += 1 self.image = next(self.animation_cycle) def main(): screen_width = 800 screen_height = 600 size = (screen_width, screen_height) pygame.init() screen = pygame.display.set_mode(size) clock = pygame.time.Clock() frames = [] # 加载每一图片文件路径 for i in range(12): # 假设有十二张图片编号从0到11 frame_image_path = f'./images/frame_{i}.png' image_surface = pygame.image.load(frame_image_path).convert_alpha() frames.append(image_surface) player_sprite = AnimatedSprite((400, 300), frames) all_sprites_group = pygame.sprite.Group(player_sprite) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False dt = clock.tick(60)/1000 # 获取两次tick之间的时间差作为dt参数传递给update方法 all_sprites_group.update(dt) screen.fill((255, 255, 255)) all_sprites_group.draw(screen) pygame.display.flip() if __name__ == '__main__': main() ``` 这段代码展示了如何加载多张图片并将它们分配给一个名为 `AnimatedSprite` 的新中的 `self.images` 属性;之后每次调用 `update()` 函数都会根据设定好的间隔自动更换下一张待渲染的图片,进而模拟出流畅的人物移动或其他形式的变化过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值