上一节学习如何利用spritesheet加载图片,但是player仍然是一张静态的图片,比较枯燥,我们要让它动起来!

Player类,先把各种状态的图片加载起来:

     # 加载各种状态的图片序列
def load_images(self):
# 站立状态的图片
self.standing_frames = [self.game.spritesheet.get_image("bunny1_ready.png"),
self.game.spritesheet.get_image("bunny1_stand.png")] # 向右走的图片
self.walking_frames_right = [self.game.spritesheet.get_image("bunny1_walk1.png"),
self.game.spritesheet.get_image("bunny1_walk2.png")] # 向左走的图片
self.walking_frames_left = []
for frame in self.walking_frames_right:
# 向左走的图片,只需要把向"右"走的图片,水平(x)方向翻转即可
self.walking_frames_left.append(pg.transform.flip(frame, True, False)) # 跳跃状态的图片
self.jump_frame = self.game.spritesheet.get_image("bunny1_jump.png")

然后要有一些bool型的状态变化(不然,我们就无法知道当前角色是在jump,还是在walk,或是stand)

 class Player(pg.sprite.Sprite):

     def __init__(self, game):
pg.sprite.Sprite.__init__(self)
self.game = game
# 是否在行走状态
self.walking = False
# 是否处于跳跃状态
self.jumping = False
# 当前状态的动画,显示的是哪一"帧"
self.current_frame = 0
# 当前状态的动画,最后一次切换是什么时候?
self.last_update = 0
# 加载图片
self.load_images()
# 初始状态为"站立"
self.image = self.standing_frames[0] ...

注:current_frame变量的作用,解释一下,一个状态下的图片可能有多张,需要知道当前切换到了第几张,这个变量保存的就是第几张图片的N值。另外一个变量last_update后面会讲到,这里先不用管。

当player向上跳起时,要切换jump的状态:

     def jump(self):
hits = pg.sprite.spritecollide(self, self.game.platforms, False)
if hits:
self.vel.y = -PLAYER_JUMP
# 修改跳跃状态
self.jumping = True

为了方便统一处理角色的动画效果,在Player类中新增一个animation函数:

    # 动画处理
def animate(self):
now = pg.time.get_ticks() # 更新walking状态
if self.vel.x != 0:
self.walking = True
else:
self.walking = False # 垂直方向速度为0,认为未跳跃
if abs(self.vel.y) < 0.5:
self.jumping = False # 切换jumping图片
if self.jumping:
self.image = self.jump_frame
else:
self.image = self.standing_frames[0] if not self.jumping and not self.walking:
# 调节这里的200,可以控制动画的播放速度
if now - self.last_update > 200:
self.last_update = now
self.current_frame += 1
# bunny1_ready.png与bunny1_stand.png的高度不同,所以切换后,要调整bottom值,保证图片的最下边缘正好站在档板上
old_bottom = self.rect.bottom
self.image = self.standing_frames[self.current_frame % len(self.standing_frames)]
self.rect = self.image.get_rect()
self.rect.bottom = old_bottom

last_update变量的作用,在animation中就体现出来了,这个变量结合当前时间,算出差值,可以控制每隔多少毫秒切换1次图片。相当于,控制角色动画的播放速度。

最后在update函数中,调用animation:

    def update(self):
# 动画处理
self.animate()
self.acc = vec(0, PLAYER_GRAVITY)
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.acc.x = -PLAYER_ACC
if keys[pg.K_RIGHT]:
self.acc.x = PLAYER_ACC self.acc.x += self.vel.x * PLAYER_FRICTION self.vel += self.acc
self.pos += self.vel # 因为walking状态的切换,依赖于x速度是否为0判断,当x在0左右的极小值摆动时,会导致判断出错
if abs(self.vel.x) < 0.5:
self.vel.x = 0
...

pygame-KidsCanCode系列jumpy-part10-角色动画(上)的更多相关文章

  1. pygame 笔记-3 角色动画及背景的使用

    上二节,已经知道如何控制基本的运动了,但是只有一个很单调的方块,不太美观,本节学习如何加载背景图,以及角色的动画. 素材准备:(原自github) 角色动画的原理:动画都是一帧帧渲染的,比如向左走的动 ...

  2. 【Salvation】——怪物角色动画&主角碰撞死亡动画

    写在前面:这个动画功能同样也是使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现,在怪物的角色动画中,很多与人物相同,这里不再重复. 一.设计敌人 拖一个精英sprite到层次面板 ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  5. Hadoop系列004-Hadoop运行模式(上)

    title: Hadoop系列004-Hadoop运行模式(上) date: 2018-11-20 14:27:00 updated: 2018-11-20 14:27:00 categories: ...

  6. nginx高性能WEB服务器系列之五--实战项目线上nginx多站点配置

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  7. 【iOS系列】-自定义Modar动画

    [iOS系列]-自定义Modar动画.md 我们需要做的最终的modar动画的效果是这样的, 就是点击cell,cell发生位移,慢慢的到第二个界面上的.为了做出这样的动画效果,我们需要以下的知识. ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  9. 五分钟了解Mecanim角色动画系统

    http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...

随机推荐

  1. bzoj4773: 负环

    题解: 网上还有一种spfa+深度限制的算法 https://www.cnblogs.com/BearChild/p/6624302.html 是不加队列优化的spfa,我觉得复杂度上限是bellma ...

  2. Vue axios 返回数据绑定到vue对象问题

    在项目中需要用到后台的数据对前端渲染,使用到了vue整合的axios,使用vue中的钩子函数在页面组件挂载完成之后向后台发送一个get请求然后将返回后的数据赋值data()中定义的属性: 执行后前端报 ...

  3. Flink的流处理--KeyBy

    逻辑上将一个流分成不相交的分区,每个分区包含相同键的元素.在内部,这是通过散列分区来实现的 object Keyby { def main(args: Array[String]): Unit = { ...

  4. img 标签的 usemap 属性

    <img src="1.gif" alt="Planets" usemap="#Map"/> <map name=&quo ...

  5. Linux read line

    cat ./port_list|while read linedo done

  6. python--异常捕获

    #异常捕获---指定异常类型 try: #尝试 fi=open(r'D:\Users\4399-3046\Desktop\test.txt',mode='wb'); fi.write('写入文字'); ...

  7. PAT (Basic Level) Practise - 害死人不偿命的(3n+1)猜想

    题目链接:https://www.patest.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果 ...

  8. 20165235 实验三 敏捷开发与XP实践

    20165235 实验三 敏捷开发与XP实践 主目录: 姓名:祁瑛 学号:20165235 班级:1652 实验课程:JAVA程序设计 实验名称:Java面向对象程序设计 实验时间:2018.4.30 ...

  9. waf python build 工具使用流程

    waf python build 工具使用流程 waf 的 build 理念 build 了之后,可以跟踪到 ${SRC} 和 ${TGT} 有关联的文件,只有 ${SRC} 被修改过,在下次buil ...

  10. Java大数相乘-hdu1063

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063 题目描述: 代码实现: import java.util.Scanner; import jav ...