0

当一个物体与另一个物体发生碰撞时,我试图阻止它。我的意思是如果用户试图将它滑到另一个我希望我的对象滑动而不是像现在那样滑过。我正在使用 Xna 和矩形碰撞功能。

 public void Update(GameTime gametime)
        {
            Currentposition = Station.Position;
            Station.Update();
            coli = IsHit(ListObs[16].ShapeO, Station.Shape);
         }

public void Draw(SpriteBatch spritebatch)
{
            if (coli == true)
            {
                Station.Position = Currentposition;
                Station.Draw(spritebatch);
            }
            else
            {
                Station.Draw(spritebatch);
            }
}

它暂时不起作用,我可以尝试使用 Farseer 或 bOx2DX,但我认为它对我来说太深了(我不需要重力)。

 public bool IsHit(Rectangle r1, Rectangle r2)
        {
            if (((r1.X + r1.Width >= r2.X) && (r1.X <= r2.X + r2.Width)) && ((r1.Y + r1.Height >= r2.Y) && (r1.Y <= r2.Y + r2.Height)))
                return true;
            else
                return false;
        }
4

2 回答 2

0

我不知道 IsHit,但这是我检测矩形之间碰撞的方法:

if (source.BoundingRect.Intersects(target.BoundingRect))
{
    ...
}

其中 BoundingRect 是 Xna 矩形

于 2013-10-24T13:45:52.637 回答
0

您通常只需要知道:

 mesh.BoundingSphere

我可以通过一个例子更好地向你解释......例如:

我们确实有一个立方体...

如果你知道到墙壁的距离,你甚至可以创建一个边界框:

float d / / middle distance <- > wall
Vector3 center = mesh.BoundingSphere.Center ;
var box = new BoundingBox (new Vector3 ( Center.X - d Center.Y - d Center.Z - d) , new Vector3 ( Center.X + d + d Center.Y , Center.Z + d) ) ;

现在您有了包含立方体的边界框(边界丰富的 Vector3 2 :最小值和最大值)。理想情况下,我们只能计算一次(可能在程序开始时)。

现在这是基础......


当你提高了你的编程技能后,你应该最终添加旋转、转换和任何你想要的......

但是如果你的立方体要旋转,那已经很复杂了。取而代之的是,每当立方体旋转时,边界框都会使用矩阵。当你看到边界框总是重新计算需要时出现的一个问题是骰子将不再是边界框对应的,但最坏的情况是立方体的角都在边界框的墙壁中间,而你边界框中有这么多“空气”,这被认为是碰撞,尽管没有碰撞。因为边界框总是面向轴,而你的立方体只是旋转。为了避免这个问题,如果你想测试碰撞,可以使用矩阵将立方体带回朝向房间的轴(通过它的旋转与碰撞测试的矩阵逆反转)。

如果您理解这一点并且能够使用它,您将能够让对象随心所欲地移动;)


我希望你能理解我试图解释的内容;)

于 2013-10-25T12:47:26.480 回答