我会让这个简短而简单。在横向滚动游戏中,我有一个用户控制的精灵和一个用作地形的精灵。环境精灵类,理论上可以是地板、天花板或墙壁,具体取决于它的位置以及玩家从哪个方向与之碰撞,它需要做一件事:击退玩家。
如果玩家与环境精灵的顶部发生碰撞,则玩家将停留在顶部边框上。如果玩家跳跃并与环境精灵的底部发生碰撞,他们将停止向上移动并开始下落。逻辑对吗?
我想不通。我的第一个解决方案希望能说明我的问题(不是实际代码,只是问题区域):
if player.rect.bottom > environment.rect.top:
player.rect.bottom = environment.rect.top - 1
if player.rect.top < environment.rect.bottom:
player.rect.top = environment.rect.bottom + 1
if player.rect.right > environment.rect.left:
etc.
etc.
etc.
这在某些时候效果很好,但在角落处变得非常狡猾,因为每次重叠超过 1px 意味着玩家的两个或更多侧面实际上一次与环境精灵发生碰撞。简而言之,这是我尝试过的每个解决方案都面临的问题。
我潜伏在每一个主题、教程、视频、博客、指南、常见问题解答和帮助网站上,我可以在谷歌上合理甚至不合理地找到,但我不知道。当然,这是某人以前解决过的问题-我知道,我已经看到了。我正在寻找建议,可能是一个链接,只是任何可以帮助我克服我只能假设是我找不到的简单解决方案的东西。
你如何重新计算碰撞精灵相对于任何和所有方向的位置?
奖励:我也实施了重力 - 或者至少是一个几乎恒定的向下力。以防万一。