专栏首页菩提树下的杨过pygame-KidsCanCode系列jumpy-part11-角色动画(下)

pygame-KidsCanCode系列jumpy-part11-角色动画(下)

上节继续,上节并没有处理向左走、向右走的动画效果,这节补上,看似很简单,但是有一些细节还是要注意:

    def jump(self):
        hits = pg.sprite.spritecollide(self, self.game.platforms, False)
        if hits:
            self.vel.y = -PLAYER_JUMP
            # 水平方向未走动时,才认为是向上跳跃状态
            # (否则,如果向上跳时,同时按左右方向键,不会切换到向左或向右的转向动画)
            if abs(self.vel.x) < 0.5:
                self.jumping = True

首先,因为向左、向右走时,视觉上要能体现出转身的效果,所以在切换jumping状态时,就要考虑到这一点,另外由于我们之前加入了摩擦力,不管是x,还是y方向,减速的递减到最后趋于静止的阶段,都是不断靠近0(如果没有特殊处理的话,会在0左右的极小值摆动),因为判断速度是否为0,最好是abs取绝对值,然后跟一个较小的值,比如0.5比较,这样比较靠谱。

类似的,在animation函数中,也会考虑到这些细节,参考下面的代码:

 1     def animate(self):
 2         now = pg.time.get_ticks()
 3 
 4         if self.vel.x != 0:
 5             self.walking = True
 6         else:
 7             self.walking = False
 8 
 9         # 如果垂直方向静止,或水平方向有走动时,认为向上跳跃状态结束
10         if abs(self.vel.y) < 0.5 or abs(self.vel.x) > 0.5:
11             self.jumping = False
12 
13         if self.jumping:
14             self.image = self.jump_frame
15         # 下面的不再需要了,否则左右走动时,会变成站立状态
16         # else:
17         #     self.image = self.standing_frames[0]
18 
19         # 水平向左/向右走的动画处理
20         if self.walking:
21             if now - self.last_update > 150:
22                 self.last_update = now
23                 self.current_frame += 1
24                 bottom = self.rect.bottom
25                 # 向左
26                 if self.vel.x < 0:
27                     self.image = self.walking_frames_left[self.current_frame % len(self.walking_frames_left)]
28                 elif self.vel.x > 0:
29                     # 向右
30                     self.image = self.walking_frames_right[self.current_frame % len(self.walking_frames_right)]
31                 self.rect = self.image.get_rect()
32                 self.rect.bottom = bottom
33 
34         if not self.jumping and not self.walking:
35             if now - self.last_update > 200:
36                 self.last_update = now
37                 self.current_frame += 1
38                 bottom = self.rect.bottom
39                 self.image = self.standing_frames[self.current_frame % len(self.standing_frames)]
40                 self.rect = self.image.get_rect()
41                 self.rect.bottom = bottom

最终效果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pygame-KidsCanCode系列jumpy-part16-enemy敌人

    接上回继续,这次我们要给游戏加点难度,增加几个随机出现的敌人,玩家碰到敌人后Game Over。

    菩提树下的杨过
  • pygame-KidsCanCode系列jumpy-part4-弹跳

    终于要到弹跳环节了,向上弹跳其实很简单,按下空格触发时,只要把y轴速度给一个向上的速度即可。

    菩提树下的杨过
  • pygame-KidsCanCode系列jumpy-part6-主角挂掉重新开始

    游戏的虚拟世界中,最让人happy的一个因素就是主角挂了,而且重来,只要restart就行了,不象现实中人的生命只有1次。回顾上节的效果,如果方块向下落时,挡板...

    菩提树下的杨过
  • PyQt5--QFileDiaglog

    py3study
  • Python应用03 使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下,我觉得PyQT使用起来更加方便,功能也相...

    Vamei
  • html5点击出现燃放烟花特效

    今天我发现了一个非常好的html特效,是由HTML5来实现的,效果非常绚丽。效果如下:

    无邪Z
  • 生成对抗网络(GAN)系列:WGAN与金融时序(附代码)

    过拟合是我们试图将机器学习技术应用于时间序列时遇到的问题之一。出现这个问题是因为我们使用我们所知道的唯一时间序列路径来训练我们的模型:已实现的历史。

    量化投资与机器学习微信公众号
  • 静态html提取正文的API和开源算法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    周小董
  • pygame-KidsCanCode系列jumpy-part3-重力及碰撞检测

    这个游戏叫jumpy,大致玩法就是模拟超级玛丽一样,可以不停在各个档板上跳动,同时受到重力的作用,会向下掉,如果落下时,没有站在档板上,就挂了。

    菩提树下的杨过
  • pygame-KidsCanCode系列jumpy-part4-弹跳

    终于要到弹跳环节了,向上弹跳其实很简单,按下空格触发时,只要把y轴速度给一个向上的速度即可。

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券