物理引擎(碰撞检测C#,GDI +)

时间:2017-01-09 06:55:46

标签: c# gdi+ physics game-physics

我目前正在使用GDI +在C#中使用2D游戏引擎,并且已经达到了我想要添加简单碰撞检测的程度。

到目前为止,我可以使用以下代码检查我的播放器是否与另一个游戏对象相交:

public static bool IntersectGameObject(GameObject a, GameObject b)
{
    Rectangle rect1 = new Rectangle((int)a.Position.X, (int)a.Position.Y, a.Sprite.Bitmap.Width, a.Sprite.Bitmap.Height);
    Rectangle rect2 = new Rectangle((int)b.Position.X, (int)b.Position.Y, b.Sprite.Bitmap.Width, b.Sprite.Bitmap.Height);

    return rect1.IntersectsWith(rect2);
}

这太棒了,我很高兴我已经走到这一步,但是我想知道我的玩家是否已经与游戏对象的顶部,底部,左侧或右侧相交,这样我才能停下来如果说......我的球员朝那个方向移动,他会撞墙。我该怎么做呢?有人可以帮助我:)。

顺便说一下,游戏对象有位图,全部是32 * 32像素,所以我不需要每像素碰撞

提前谢谢你:)

4 个答案:

答案 0 :(得分:1)

计算两个矩形是否相交只是一些比较的问题(我知道你已经在使用IntersectsWith):

if (Left > other.Right) return false;
if (Right < other.Left) return false;
if (Top > other.Bottom) return false;
if (Bottom < other.Top) return false;
return true;

要确定碰撞的方向,您必须考虑以下可能性:

  • 一个矩形完全包含另一个(无方向碰撞)
  • 它可能会创建一个&#34; plus&#34;图(向各个方向碰撞)
  • 矩形的一个角可以与另一个角的角相交(在两个方向上碰撞)

无论如何,要确定它是否在左侧发生碰撞:

if (Right > other.Left && Right < other.Right && Left < other.Left)
{
    // the right side of "this" rectangle is INSIDE the other
    // and the left side of "this" rectangle is to the left of it
}

最后但并非最不重要的一点是,如果你逐帧计算这个帧,那么对象可能会跳过&#34;跳过&#34;另一个。对于更逼真的物理场景,您必须跟踪时间并计算 时它与矩形相交(每个边缘)。

答案 1 :(得分:0)

如果你需要碰撞检测,你需要一个刚体,你通常用物理学来移动刚体。据我所知,上面的代码片段可能存在问题。如果您使用变换移动它们,则应标记为运动学。这意味着它不会被物理学所感动,而是通过变换。

您想要移动的运动刚体应在FixedUpdate期间完成,以正确应用碰撞。

如果你想知道你击中哪一侧,你可以光线投射到物体

此代码段提供了一个示例,显示了您可以在碰撞时执行的光线投射。最终,您使用的是哪种游戏引擎?

//this ray will generate a vector which points from the center of 
 //the falling object TO object hit. You subtract where you want to go from where you are

 Ray MyRay = ObjectHit.position - ObjectFalling.position;


 //this will declare a variable which will store information about the object hit
 raycasthit MyRayHit; 

 //this is the actual raycast
 raycast(MyRay, out MyRayHit);

 //this will get the normal of the point hit, if you dont understand what a normal is 
 //wikipedia is your friend, its a simple idea, its a line which is tangent to a plane

 vector3 MyNormal = MyRayHit.normal;

 //this will convert that normal from being relative to global axis to relative to an
 //objects local axis

 MyNormal = MyRayHit.transform.transformdirection(MyNormal);

 //this next line will compare the normal hit to the normals of each plane to find the 
 //side hit

 if(MyNormal == MyRayHit.transform.up)
 {
 you hit the top plane, act accordingly
 }
 //important note the use of the '-' sign this inverts the direction, -up == down. Down doesn't exist as a stored direction, you invert up to get it. 

 if(MyNormal == -MyRayHit.transform.up)
 {
 you hit the bottom plane act accordingly
 }
 if(MyNormal == MyRayHit.transform.right)
 {
 hit right
 }
 //note the '-' sign converting right to left
 if(MyNormal == -MyRayHit.transform.right)
 {
 hit left
 }

答案 2 :(得分:0)

选择在玩家对象的每一侧都有4个不同的对象,这取决于哪一方与游戏对象相交,您可以知道要防止哪个移动方向?

答案 3 :(得分:0)

如果您要逐帧处理,一个不错的选择可能是存储先前的位置P0x,P0y和当前位置P1x,P1y

enter image description here

然后,您可以计算向量Vx,Vy,并可以计算交点Ix,Iy。因此,您可以获得有关碰撞的更精确信息。