Collission似乎不起作用

时间:2017-11-30 21:13:42

标签: c# xna

我正试图在暴徒和玩家之间写下一个碰撞,所以我试图将两个怪物添加到一个矩形

   protected bool Collide()
    {

        PlayerRect = new Rectangle((int)playerPos.X, (int)playerPos.Y, playerFrameSize.X, playerFrameSize.Y);
        MobsRect = new Rectangle((int)greenMobPos.X + (int)orangeMobPos.X, (int)greenMobPos.Y + (int)orangeMobPos.Y, greenMobFrameSize.X + orangeMobFrameSize.X, greenMobFrameSize.Y + orangeMobFrameSize.Y);

        return PlayerRect.Intersects(MobsRect);
    }

这就是我的代码,但只有我的'greenMob'正确碰撞,第二个暴徒'orangeMob'不会碰撞。我应该将它们分开并检查每一个是否发生碰撞?

1 个答案:

答案 0 :(得分:0)

protected bool Collide()
{

    PlayerRect = new Rectangle((int)playerPos.X, (int)playerPos.Y, playerFrameSize.X, playerFrameSize.Y);
    MobsRectGreen = new Rectangle((int)greenMobPos.X , (int)greenMobPos.Y , greenMobFrameSize.X , greenMobFrameSize.Y ;
    MobsRectOrange = new Rectangle((int)orangeMobPos.X,  (int)orangeMobPos.Y,  orangeMobFrameSize.X, orangeMobFrameSize.Y);

    return PlayerRect.Intersects(MobsRectGreen ) || return PlayerRect.Intersects(MobsRectOrange )  ;
}

您计算每个暴徒和玩家的边界框。如果玩家与绿色边界框相交,则会与绿色玩家发生碰撞。如果它与橙色边界框相交,则会与该边界框发生碰撞。 ||表示逻辑或。

你的支票将绿色和橙色X加在一起,y加在一起,x + y的大小合在一起,除非它们都靠得很近并且是"一个"形成。 (就像一个有屋顶的房子,每个都单独建模但是它们一起移动/保持在一起 - 虽然箱子对屋顶没有多大意义)。

创建一个占用一个暴徒的方法可能会更好,并检查玩家是否发生碰撞:

private bool CollideWithMob(Mob m)
{
    // do the check for player and m here
}

protected bool Collide()
{
    return CollideWithMob(greenMob) || CollideWithMob(orangeMob); 
}

将Pos和FrameSize放入class Mob作为要检查的属性。如果拳头检查是否为假,则此检查将计算玩家矩形两次,组合方法不会这样但是更清楚。