在对一些代码进行了一些调整之后,我从某人那里得到了一个使字符图像沿其方向移动的信息,并且上下左右输入我将它们放在一起:(希望代码不太混乱)
Sprite工作表仅沿长度方向运行,因此基本上每个Sprite部分都是不同的动作.现在是否有一种方法可以使我的代码与当前代码一起工作,以从一组“动作”中循环下来以制作动画?
例如:
“左转”是精灵3.因此,在指定该列之后,可以循环播放多少帧动画(让我们说4个)以制作动画?
图片示例:
http://animania1.ca/ShowFriends/dev/example.jpg
解决方法:
应该很容易.
如果您将帧号记录在变量中,则可以用要获得要显示的动画帧号的帧数取模.
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动作游戏中,而您则不得不四处躲避子弹?
这也使任何物理计算都更加简单.您必须根据游戏的类型做出判断.