Python Pygame中的Walls逻辑

Python Pygame中的Walls逻辑,python,algorithm,pygame,collision,Python,Algorithm,Pygame,Collision,我正在用Pygame做一个游戏,现在我专注于如何处理玩家和墙之间的碰撞。这是带有单元格的2D RPG,其中一些单元格是墙。你们从上面看世界,就像吃豆人一样 所以,我知道我可以通过pygame.spritecollide()获得碰撞列表,它将返回玩家碰撞的对象列表。我可以通过player.rect.clip(wall.rect)获得“碰撞矩形”,但我如何才能从墙上取回播放器呢 所以,我有很多想法。第一种方法是将玩家向相反方向推回,但如果玩家同时向右侧和底部方向移动,并与自身右侧的垂直墙发生碰撞,玩

我正在用Pygame做一个游戏,现在我专注于如何处理玩家和墙之间的碰撞。这是带有单元格的2D RPG,其中一些单元格是墙。你们从上面看世界,就像吃豆人一样

所以,我知道我可以通过
pygame.spritecollide()
获得碰撞列表,它将返回玩家碰撞的对象列表。我可以通过
player.rect.clip(wall.rect)
获得“碰撞矩形”,但我如何才能从墙上取回播放器呢

所以,我有很多想法。第一种方法是将玩家向相反方向推回,但如果玩家同时向右侧和底部方向移动,并与自身右侧的垂直墙发生碰撞,玩家会被绊倒,因为只需要向左推,而不需要向上推

第二个想法是实现对角移动,就像左下移动一样。但这样一来,我们就不知道如何先移动:向左移动还是向下移动,顺序成为最重要的因素


因此,我不知道我应该使用什么算法。

如果你知道单元格中心的位置和播放器的位置,你可以计算出在该时间点到墙的x距离和y距离。在这一点上,是否有可能取每个距离的绝对值,然后取最大值作为将玩家推入的方向

e、 g.玩家与墙壁右侧碰撞,因此y方向上与墙壁中心的距离应小于x方向上的距离。 因此,您知道玩家与墙的左侧或右侧发生碰撞,而不是与墙的顶部发生碰撞,这意味着推应向右或向左

如果玩家的移动以[x,y]的形式存储,那么知道是向左推还是向右推并不重要,因为在x轴上翻转移动方向会得到正确的结果

因此,在本例中,推力应在x方向 e、 g.player.vel_x=-player.vel_x。 这将保持y轴的运动不变,因此希望不会导致您提到的问题


这有帮助吗?

游戏完全基于细胞吗?就像每个物体都在一个特定的格子里,玩家永远不可能在有障碍物的格子里一样?这是一个动态游戏,所以格子大小是64px,玩家的速度可以不同,比如(5,5)等等。格子是唯一的位置特征,玩家可以走他想走的地方。嗯,就像我的手艺。它有块,但玩家不仅可以在块之间移动。你写过代码吗?查看代码会很有帮助,因为这是一个非常广泛的问题。对不起,我删除了处理冲突的代码。但我有这样一个:GameObject类、Wall类(GameObject)、Player类(GameObject),以及我可以在Player.update()函数中放入任何内容的每一个勾号。这看起来像是一个很好的算法,我会考虑一下。但是这样的话,我应该什么时候计算呢?当我已经撞到墙的时候?如果我同时撞上两三堵墙会发生什么?还有一个:玩家的速度可以超过一个格块,所以在下一个格块中,它可能不在最近的格块中。是的,碰撞应该发生,然后上面的过程应该发生。如果对象似乎在墙中,则可能需要调整x轴或y轴上的位置。如果发生这种情况,则过程将是:更新位置、检查碰撞、调整移动速度、以相同方向调整位置以确保对象在1帧内不显示在墙内,然后继续正常显示谢谢。我明天会试试看你的答案,如果移动速度太快的话,同时撞上三堵或更多的墙可能不起作用。为了降低出现这种问题的风险,可以简单地在每一帧中以对象在屏幕上移动速度的一半对对象进行多次更新,但这可能不是必需的。它是有效的!我不停地想,互联网上没有关于它的问题。非常感谢。