3

在对一些代码进行了一些调整后,我从某人那里得到了一个字符图像在其方向和上下左右输入方面移动,我把它放在一起:(希望代码不会太乱)

角色移动代码 + IMG

Sprite 表仅纵向运行,因此基本上每个 sprite 部分都是不同的动作。现在有没有一种方法可以制作一个与当前代码一起运行的代码,以便从一组“动作”循环下来以制作动画?

例如:“向左跑”是精灵 3。那么在我们指定该列之后,是否可以循环运行动画的多少帧(比如说 4)以制作动画?

示例图片: http ://animania1.ca/ShowFriends/dev/example.jpg替代文字

4

1 回答 1

4

这应该很容易。

如果将帧号记录在变量中,则可以将其与帧数取模,以获得要显示的动画帧号。

frame_count = 0
animation_frames = 4
while quit == False:
    # ...
    # snip
    # ...
    area = pygame.Rect(
        image_number * 100,
        (frame_count % animation_frames) * 150,
        100,
        150
    )
    display.blit(sprite, sprite_pos, area)
    pygame.display.flip()
    frame_count += 1

如果不同的动作有不同的帧数,则必须在更新 image_number 时更新 animation_frames。

此外,这假设可以从任何帧开始播放动画。如果不是这种情况,您需要记录动作开始时的帧数,并将其从模数之前的帧数中删除:

    area = pygame.Rect(
        image_number * 100,
        ((frame_count - action_start_frame) % animation_frames) * 150,
        100,
        150
    )

关于您的事件处理的说明。如果你按住,比如说,向左,然后点击向右,但一直按住向左,精灵会停止移动,因为你处理的最后一个事件是一个按键事件,尽管我仍然按住左键。

如果这不是您想要的,您可以通过记录您感兴趣的键的向上/向下状态或使用pygame.key.get_pressed接口来绕过它。

另一方面,您的目标似乎是固定帧速率,同时根据上一帧所用时间确定您的精灵移动多远。在我看来,这可能并不理想。

2D 动作游戏通常需要以可预测的方式运行。如果某些 CPU 繁重的进程在您的计算机的后台启动并导致您的游戏不再能够每秒产生 60 帧,那么最好放慢速度,而不是让您的对象开始跳过帧之间的巨大距离。想象一下,如果这发生在像合金弹头这样的 2D 动作游戏中,你必须四处跳来躲避子弹?

这也使任何物理计算变得更加简单。你必须根据它是什么类型的游戏来做出判断。

于 2009-04-10T11:35:13.440 回答