gpt4 book ai didi

python - Pygame - 防止 Sprite 重叠

转载 作者:行者123 更新时间:2023-12-01 05:34:19 26 4
gpt4 key购买 nike

我会让这个简短而简单。在横向卷轴游戏中,我有一个用户控制的 Sprite 和一个充本地形的 Sprite 。环境 Sprite 类理论上可以是地板、天花板或墙壁,具体取决于它的位置以及玩家与它碰撞的方向,它需要做一件事:击退玩家。

如果玩家与环境 Sprite 的顶部发生碰撞,则玩家会停留在顶部边框上。如果玩家跳跃并与环境 Sprite 的底部发生碰撞,他们就会停止向上移动并开始下落。逻辑对吗?

我想不通。我的第一个解决方案希望能够说明我的问题(不是实际代码,只是问题区域):

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.

这在某些时候工作得很好,但在拐角处会变得非常危险,因为每次重叠超过 1 像素意味着玩家的两侧或多侧实际上一次与环境 Sprite 碰撞。简而言之,这是我尝试过的每个解决方案所面临的问题。

我潜伏了我可以在谷歌上合理甚至不合理地找到的每一个线程、教程、视频、博客、指南、常见问题解答和帮助网站,但我不知道。当然,这是以前有人解决过的问题 - 我知道,我已经看到了。我正在寻找建议,可能是一个链接,只是任何可以帮助我克服我只能假设是我找不到的简单解决方案的东西。

如何重新计算碰撞 Sprite 相对于任意和所有方向的位置?

奖励:我也实现了重力 - 或者至少是近乎恒定的向下力。以防万一。

最佳答案

您已经非常接近您的解决方案了。由于您使用 Pygame 的矩形来处理碰撞,我将为您提供最适合它们的方法。

假设一个 Sprite 将与另一个 Sprite 重叠多少是不太安全的。在这种情况下,您的碰撞分辨率假设 Sprite 之间有一个像素(可能更好地称为“单位”)重叠,而实际上听起来您得到的不仅仅是这个。我猜你的玩家 Sprite 一次不会移动一个单位。

然后你需要做的是确定你的玩家与障碍物相交的确切单位数量,并将他向后移动那么多:

if player.rect.bottom > environment.rect.top:
# Determine how many units the player's rect has gone below the ground.
overlap = player.rect.bottom - environment.rect.top
# Adjust the players sprite by that many units. The player then rests
# exactly on top of the ground.
player.rect.bottom -= overlap
# Move the sprite now so that following if statements are calculated based upon up-to-date information.
if player.rect.top < environment.rect.bottom:
overlap = environment.rect.bottom - player.rect.top
player.rect.top += overlap
# Move the sprite now so that following if statements are calculated based upon up-to-date information.
# And so on for left and right.

即使在凸角和凹角处,这种方法也应该有效。只要您只需要担心两个轴,独立解决每个轴就能满足您的需求(只需确保您的玩家无法进入他不适合的区域)。考虑这个简单的示例,其中玩家 P 与环境 E 在一个角落相交:

Before collision resolution:
--------
| P --|------ --- <-- 100 y
| | | | <-- 4px
-----|-- E | --- <-- 104 y
| |
---------
^
2px
^ ^
90 x 92 x

Collision resolution:
player.rect.bottom > environment.rect.top is True
overlap = 104 - 100 = 4
player.rect.bottom = 104 - 4 = 100

player.rect.right > environment.rect.left is True
overlap = 92 - 90 = 2
player.rect.right = 92 - 2 = 90

After collision resolution:
--------
| P |
| |
---------------- <-- 100 y
| |
| E |
| |
---------
^
90 x

关于python - Pygame - 防止 Sprite 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19456218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com