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

《《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1》中使用的多张序列帧图片,每张图片表示僵尸的一个动作。而有时序列帧会在同一张图片上,如图1所示。

图1 序列帧会在同一张图片上

从图1中可以看出,每一行表示一组序列帧,分别表示僵尸行动的8个方向(上、下、左、右、左上、右上、左下和右下)。在本文中,我们只取僵尸向左和向右的两组序列帧,效果如图2所示。

图2 两组序列帧的效果图

1 MySprite类的__init__()方法

MySprite类的__init__()方法的代码如图3所示。

图3 MySprite类的__init__()方法的代码

其中,该方法的中的filename参数表示帧序列图片(大图)的文件名;width和height表示一帧图片的宽度和高度;direction表示僵尸运动的方向;column表示大图中每一行包含的列数,也就是每个方向的帧数。

《《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1》中提到的更新帧序列的方法相同,通过单张序列帧显示动画也是通过时间来更新帧序列。因此,第32-33行代码定义了MySprite类的两个属性,last_time和current_time表示表示帧图片显示的起始时间和结束时间。第35-43行定义的类属性如图4所示。

图4 MySprite类属性示意图

其中,图3中第35行代码定义了master_image属性,表示帧序列的大图;第36-37行的frame_width和frame_height属性,表示一帧的宽度和高度;第38行定义的rect表示一帧的位置,也就是显示僵尸的位置;第39行定义的direction属性表示僵尸行走的方向;第40行定义的columns属性表示每一个方向上包含多少帧;第41行定义current_frame属性表示当前显示的是第几帧,例如假设僵尸当前是向左方行走,其direction属性的值是1,columns属性的值是8,因此current_frame属性的值是1×8=8,表示第8帧,也就是图4中第2行(标号为1)的第一帧;第42-43行定义的first_frame和last_frame表示某个方向上的第一帧和最后一帧,还是以direction=1,columns=8为例,此时first_frame=8,而last_frame=15,如图4所示。

2 MySprite类的update()方法

2.1 更新帧序列号

更新帧序列号的方法,与《《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1》中提到的相同,即使用当前时间current_time减去当前帧开始显示的时间last_time的差与阈值时间speed进行比较,代码如图5所示。

图4 更新帧序列号的代码

2.2 根序列据帧号显示不同的帧图片

2.2.1 根据帧序列号确定帧的位置

根据帧序列号确定帧的位置,也就是确定该帧图片左上角的坐标。要想确定帧图片左上角的坐标,就必须要知道该帧图片位于图1中的第几行和第几列。代码如图5所示。

图5 根据帧序列号确定帧位置的代码

其中,rect_x和rect_y分别表示帧图片左上角的横纵坐标。self.frame_width和self.frame_height是帧图片的宽度和高度。其原理图如图6所示。

图6 根据帧序列号确定帧位置的原理图

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值