C# XNA:仅在初始交点上调用矩形交点

C# XNA:仅在初始交点上调用矩形交点,c#,xna,collision-detection,intersection,rectangles,C#,Xna,Collision Detection,Intersection,Rectangles,我目前正在xna制作一款自上而下的射击游戏。在这个项目中,我已经多次设法解决这个经常出现的问题,但现在我正在编程游戏,它正在破坏我的碰撞。我希望玩家在与敌人接触时的生命只减少1,但是如果矩形相交,它会以软件的刷新率调用(或者我现在想的是怎么做的),所以玩家的生命实际上会在第二个相交处减少几十。有没有办法阻止这一切 不起作用的示例代码: if (playerRectangle.Intersects(enemyRectangle)) {

我目前正在xna制作一款自上而下的射击游戏。在这个项目中,我已经多次设法解决这个经常出现的问题,但现在我正在编程游戏,它正在破坏我的碰撞。我希望玩家在与敌人接触时的生命只减少1,但是如果矩形相交,它会以软件的刷新率调用(或者我现在想的是怎么做的),所以玩家的生命实际上会在第二个相交处减少几十。有没有办法阻止这一切

不起作用的示例代码:

            if (playerRectangle.Intersects(enemyRectangle))
            {
                enemyAlive = false;
                playerLives--;
            }

我知道这看起来很简单,但这整周都在干扰我的比赛。提前感谢您的帮助或建议

将您的条件更改为:

(playerRectangle.Intersects(enemyRectangle) && enemyAlive)
这应该对你有好处

编辑:正如Zhafur指出的,可以进行一个简单的优化:

(enemyAlive && playerRectangle.Intersects(enemyRectangle))
我要指出的是,
Intersects
方法必须检查玩家矩形的所有4条边与敌人矩形的所有4条边。这将使这个简单的调用类似于16张较小的支票。如果有人确实知道这个数字,如果我错了,请纠正我。我个人会这样做:

float playerSize = 16f; // These are the _radius_ not the diameter.
float enemySize = 16f;
然后将条件中的
Intersects
方法替换为调用
Vector2.Distance

(enemyAlive && (playerSize + enemySize >= Vector2.Distance(playerLocation, enemyLocation)))

其中playerLocation和enemyLocation代表玩家和敌人的中心点

我会检查enemyAlive,如果是真的,然后检查两个矩形是否相交。这将更符合性能要求。:)+哦,我的天,非常感谢你!太好了!我有点气愤,事情太简单了,哈哈。太感谢你了@扎福尔:同意,但还有其他方法来处理这种情况。我将附加一个编辑以反映一些优化。