我试图阻止一个物体与另一个碰撞。我的意思是,如果用户尝试将其滑动到另一个上,我希望我的对象能够滑动,而不是像现在这样过去。 我正在使用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;
}
答案 0 :(得分:0)
我不知道IsHit,但这里是我如何检测矩形之间的碰撞:
if (source.BoundingRect.Intersects(target.BoundingRect))
{
...
}
其中BoundingRect是Xna矩形
答案 1 :(得分: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:最小和最大)。 理想情况下,我们只能计算一次(可能在程序开始时)。
现在那是基础......
当你提高了你的编程技巧时,你应该最终添加轮换,转换和你想要的任何东西......
但是如果你的立方体必须旋转,它已经很复杂了。 相反,每当你在立方体旋转时你最重要的边界框,它使用矩阵。 当您看到边界框总是重新计算时发生的问题是骰子将不再是边界框对应的,但最坏的情况是立方体的角落在边界框的墙壁中间就可以了因此,在您的边界框中有很多“空气”,虽然没有碰撞,但它被视为碰撞。 对于边界框始终面向轴,而您的立方体则只是旋转。 为了避免这个问题,如果你想在碰撞上进行测试(通过旋转使用矩阵反向反转进行碰撞测试),可以使用矩阵将立方体背轴定向在一个房间内。
如果您理解了这一点并且能够使用它,您将能够让对象随时随地移动;)
我希望你能理解我试图解释的内容;)