Pygame:精灵动画理论 - 需要反馈

3

通过对一些代码进行微调,使得字符图像可以根据其方向和上下左右输入移动,我将它们组合起来了:(希望代码不会太乱)

角色移动代码+图片

精灵表只能按长度运行,因此每个精灵部分基本上都是不同的动作。现在是否有一种方法可以使用当前代码循环从设置的“动作”中向下运行,以制作动画?

例如: “向左跑”是精灵3。那么在我们指定该列之后,是否可能循环下跑步动画的帧数(假设为4),以制作动画?

示例图片: alt text http://animania1.ca/ShowFriends/dev/example.jpg


这个问题非常令人困惑。请阅读文本并澄清一下,以便我们理解您的意思。 - Aaron Digulla
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
    )

关于事件处理的注意事项。如果你按住左键,然后轻敲右键但仍按住左键,精灵停止移动,因为最后一个处理的事件是keyup事件,尽管我仍在按住左键。
如果这不是你想要的,你可以通过记录你感兴趣的键的上下状态或使用pygame.key.get_pressed接口来解决。
另外,你似乎正在追求固定帧率,同时根据上一帧的时间确定移动精灵的距离。在我看来,这可能并不理想。
2D动作游戏通常需要以可预测的方式工作。如果你的电脑后台开始运行某些CPU密集型进程,导致你的游戏无法再产生60帧每秒,那么减速可能比让你的物体在帧之间跳跃巨大的距离更可取。想象一下如果这种情况发生在像《合金弹头》这样的2D动作游戏中,你必须跳来跳去避开子弹?
这也使得任何物理计算更加简单。你将不得不根据游戏类型做出判断。

非常感谢你的建议。我同意你关于性能和其他方面所说的一切。我从免费代码的参考和给我的建议中学习所有这些东西。你是否能指引我学习更适合我的需求的东西? - RamonLion
不幸的是,我没有找到任何真正好的教程。我建议阅读任何看起来合适的教程,但要记住,仅仅因为人们在互联网上发布了他们的作品,并不意味着他们是专家。最重要的是让东西能够工作,稍后再进行清理。 - SpoonMeiser
通过将值60传递给Clock.ticks,您已经设置了每秒60帧的帧速率。 - SpoonMeiser
哦,所以我不需要改变任何东西。 - RamonLion
那么这是否意味着我要去掉:time_passed = clock.tick(60) time_passed_seconds = time_passed / 1000.0 sprite_pos += key_direction * sprite_speed * time_passed_seconds中的time_passed_seconds? - RamonLion
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接