Pygame:精灵动画理论 - 需要反馈
经过一些调整,我把从别人那里得到的代码整理了一下,让角色的图像可以根据方向和上下左右的输入来移动。希望代码不是太乱。
这个精灵图只在长度方向上运行,也就是说每个精灵部分代表一个不同的动作。现在,我想知道有没有办法写一段代码,和现在的代码配合使用,从一个设定的“动作”开始循环,以便制作动画?
举个例子:‘向左跑’是精灵图的第3列。那么在我们指定了这一列之后,是否可以循环下去,播放跑步动画的帧数(比如说4帧),来制作动画呢?
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
如果不同的动作有不同的帧数,当你更新图像编号的时候,也需要更新动画帧数。
另外,这里假设从任何帧开始播放动画都是可以的。如果不是这样的话,你需要记录下动作开始时的帧数,然后在计算时从总帧数中减去这个值:
area = pygame.Rect(
image_number * 100,
((frame_count - action_start_frame) % animation_frames) * 150,
100,
150
)
关于事件处理的一点说明。如果你按住左键,然后轻轻点一下右键,但仍然按着左键,角色就会停止移动,因为你处理的最后一个事件是“松开”事件,尽管你还在按着左键。
如果你不想这样,可以通过记录你感兴趣的按键的按下/松开状态来解决,或者使用pygame.key.get_pressed接口。
另外,你似乎想要一个固定的帧率,同时又根据上一个帧的耗时来决定角色移动的距离。在我看来,这可能不是最理想的做法。
2D动作游戏通常需要以可预测的方式运行。如果你的电脑后台有一些占用CPU的进程,导致游戏无法保持每秒60帧的速度,可能更好的做法是让游戏慢下来,而不是让角色在帧之间跳过很大的距离。想象一下,如果在像《合金弹头》这样的2D动作游戏中发生这种情况,你需要跳跃躲避子弹,那会多麻烦啊?
这也让物理计算变得简单很多。你需要根据游戏的类型来做出判断。