具有多种状态的 Pygame 动画

Posted

技术标签:

【中文标题】具有多种状态的 Pygame 动画【英文标题】:Pygame animation with multiple states 【发布时间】:2019-08-18 00:48:00 【问题描述】:

我正在尝试找出创建具有多种状态的动画的最佳方法,但我似乎无法找到任何以干净方式实现我所追求的示例。

我有一个角色的精灵表,它有两种跳跃动画状态,有 6 帧角色动画基本上是从地面上跳下来。

还有另外 6 帧,角色处于“跳跃循环”中,因此角色已经离开地面,但手臂等略微移动。

当我将所有图像放入一个列表并遍历它们时,跳跃的初始部分看起来不错,因为角色离开地面然后进入跳跃循环。但是一旦帧的跳跃循环序列完成,动画就会回到半空中的开始,所以看起来角色只是从什么东西上跳下来。

我目前的功能代码如下

def animate(self):            
    now = pg.time.get_ticks()

    # Jumping
    if self.jumping:
        if now - self.last_update > 18:
            self.last_update = now
            if self.left:
                self.current_frame = (self.current_frame + 1) % len(self.jump_l)
                bottom = self.rect.midbottom
                self.image = self.jump_l[self.current_frame]
                self.rect = self.image.get_rect()
            elif self.right:
                self.current_frame = (self.current_frame + 1) % len(self.jump_r)
                bottom = self.rect.midbottom
                self.image = self.jump_r[self.current_frame]
                self.rect = self.image.get_rect()
            self.rect.midbottom = bottom

动画有效,但基本上我想做的只是前 6 帧,然后循环播放最后 6 帧,直到角色落地。

【问题讨论】:

能否贴出完整的代码和图片来源。 【参考方案1】:

我建议将动画 Spritesheet 拆分,这样一排六帧用于跳跃,另一排用于其他六帧下降。

一旦你能做到这一点,只需像这样检查你的精灵速度变量是正还是负:

if self.vel > 0:
    # Switch animation frames to jumping up

elif self.vel < 0:
    # Switch animation frames to falling down

【讨论】:

我同意,将动画分成两组听起来像是一个很好的前进方式,有点像“启动”和“着陆”组。不过,我对精灵表的感觉很复杂。 我在动画方面使用 spritesheets,有一个 spritesheet 类 Here,它对我有用。我只是简单地使用load_strip() 来抓取一条图像,然后将它们加载到我自己的动画代码中。【参考方案2】:

谢谢大家,我确实将动画一分为二(不是精灵表),我让它与速度一起工作(self.vel.x > 0),但经过一番考虑,那些额外的 6 帧并没有真正增加太多到动画所以我只是把它拿出来并使用跳跃的循环部分作为动画。

仔细观察,实际上只有 3 帧,即角色在完全跳跃之前稍微抬起腿,这并不明显,因此并没有真正添加任何东西,所以我放弃了这个想法.

【讨论】:

以上是关于具有多种状态的 Pygame 动画的主要内容,如果未能解决你的问题,请参考以下文章

具有超过 1 个步骤的突出显示状态的 UIButton

在队列中按 4 个游戏对象的顺序播放 - 动画师(不是具有多个状态的单个动画师)

Vue过渡动画

Vue过渡动画

让View跟随状态动起来——StateListAnimator

Pygame 级别/菜单状态