gpt4 book ai didi

c# - 碰撞响应 2d

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:01 25 4
gpt4 key购买 nike

问题: Problem http://img684.imageshack.us/img684/5486/prob1b.png Problem http://img810.imageshack.us/img810/3157/prob3.png绿色 block 是玩家,灰色 block 是静态砖

当玩家靠着一个方 block 跳起来时,当玩家站在碰撞方 block 的边缘附近时,它会被推向左/右。这可能是因为向上跳跃速度大于 x 轴运动(甚至可能为 0),因此玩家在 x 轴上被修正了......

伪代码如下:

  • 1:获取玩家周围的碰撞方 block
  • 2:foreach 碰撞瓦片:

{

  • 2a:获取相交深度
  • 2b:用最小的校正轴校正玩家位置(例如:if (Math.Abs​​(X) > Math.Abs​​(Y) Then correct Y value. Else正确的 X 值)

//下面是一些其他伪代码,不应该是问题的一部分:

  • 2c:如果碰撞发生在玩家的顶部:取消所有跳跃
  • 2d:如果碰撞发生在玩家的底部:IsStandingOnGround = true;

一些代码:

  foreach (Stone stone in collidingStones)
{
#region Collision Response
if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
{
//warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
if (Math.Abs(correction.X) > Math.Abs(correction.Y))
{
Location += new Vector2(correction.X, 0);
}
else
{
Location += new Vector2(0, correction.Y);
}

最佳答案

有趣的问题,几年前我在 Delphi 开发游戏时遇到了同样的问题。几点:

  • 你应该在碰撞时纠正 X 和 Y。仅校正 X 或 Y 在高速下(超过 ~3px/update)看起来不自然。
  • 你正在做的那种碰撞检测适用于矩形填充的瓷砖,但如果你有不规则的瓷砖(比如斜坡部分的三角形)那么就不可能计算碰撞的校正值。

最后我制作了一个引擎,其中每个图 block 都有 位图(实际可见的图形)和我称之为 freemap 的东西,这是一个黑白位图表示图 block 内自由空间的 map 。然后我编写了首先在瓦片空间中运行的碰撞函数(以确定与玩家发生碰撞的瓦片),然后在瓦片的位图中运行。

移动玩家时,您会根据玩家速度计算下一个点,然后沿着当前位置和计算出的下一个位置之间的直线测试每个点。如果在那条线上遇到障碍物,那么你会在那一点停止播放器。

关于c# - 碰撞响应 2d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6871223/

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