【问题标题】:C# XNA Collision DetectionC# XNA 碰撞检测
【发布时间】:2013-11-08 20:19:21
【问题描述】:

我无法让我的碰撞检测算法正常工作。我正在从包含 0 和 1 的 .txt 中读取数据(0 是空格,1 不能通过)。我的算法有时会捕捉到有时它没有捕捉到并且最终不起作用。我当前的算法发布在下面,其中 sep 是一个分隔值,以防止我的精神重叠。

private void collisionDetect()
{
    float diffxleft, diffxright, diffytop, diffybottom;
    float diffx, diffy;

    hit = false;
    foreach (Block b in blocks)
    {
        if (hit)
            break;
        if (inside(charPos, sep, b))
        {
            hit = true;
            diffxleft = Math.Abs(charPos.X + sep - b.pos.X);
            diffxright = Math.Abs(charPos.X - sep - (b.pos.X + b.rect.Width));
            diffytop = Math.Abs(charPos.Y + sep - b.pos.Y);
            diffybottom = Math.Abs(charPos.Y - sep - (b.pos.Y + b.rect.Height));
            diffx = Math.Min(diffxleft, diffxright);
            diffy = Math.Min(diffytop, diffybottom);
            if (diffx < diffy)
            {
                charVel.X = 0;
                if (diffxleft < diffxright)
                    charPos.X = b.pos.X - sep;
                else
                    charPos.X = b.pos.X + b.rect.Width + sep;
            }
            else
            {
                charVel.Y = 0;
                if (diffytop < diffybottom)
                    charPos.Y = b.pos.Y - sep;
                else
                    charPos.Y = b.pos.Y + b.rect.Height + sep;
            }
        }
    }

    foreach (Block b in blocks)
    {
        b.disp.X = b.pos.X + 10 - bkgdisplay.X;
        b.disp.Y = 470 - b.pos.Y;
    }
    charPosDisp.X = charPos.X - bkgdisplay.X;
    charPosDisp.Y = 480 - charPos.Y;
}

救命!

【问题讨论】:

  • 您能否更清楚地了解究竟是什么不起作用?它有时只是不检测 X 碰撞,还是不检测 Y 碰撞,或两者兼而有之?还是它检测到碰撞但不阻止玩家在“空间”中移动?
  • 从最好的情况来看,我可以说它有时并没有检测到它在其他地方没有检测到它创建的墙。我的玩家能够穿过一些他们不应该能够穿过的墙壁,而其他人则被实际上没有绘制的墙壁挡住了..

标签: c# xna collision-detection


【解决方案1】:

我会稍微改变您处理冲突的方式,使其更易于阅读和实施。

说对于每个块(或图块),0 或 1 值表示该块是否可碰撞。然后,您可以在块位置和精灵位置之间使用 intersect 方法来查看它们当前是否相交。如果它们确实相交并且图块的布尔值设置为 1,那么我们就会发生碰撞,然后您可以处理碰撞,即停止精灵移动,将其反弹回来等。如果值为 0,则精灵可以移动到当前挡位。

使用以下伪代码很容易实现。

第 1 步:读入块的值并在 类来说明它是否可碰撞,即从字符串中解析值,如果值是 0 然后 bool = false 否则 bool = true。

第二步:在block类中创建一个返回collidable成员变量的方法 并且会做类似bool is_collidable() const { return collide; }

第 3 步:在 sprite rect 和块之间使用 Rectangle.Intersect method 矩形。

第 4 步:查看块和精灵之间是否有交集后,进行测试 块成员变量,看它是真还是假。

第 5 步:如果值为 true,则我们不能越过该图块,否则我们可以。

【讨论】:

  • 我还建议使用 Rectangle.Intersect,因为它使碰撞处理更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2015-10-08
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多