【问题标题】:XNA: only call rectangle intersection on the initial intersectionXNA:仅在初始交点上调用矩形交点
【发布时间】:2014-03-29 23:34:18
【问题描述】:

我目前正在 xna 中制作自上而下的射击游戏。我已经在项目中多次设法解决这个持续存在的问题,但现在我正在编写游戏玩法并且它与我的碰撞搞砸了。如果他们与敌人接触,我希望玩家的生命只下降 1,但是如果矩形相交,它会以软件的刷新率调用(或者现在我想它已经完成了)所以玩家在第二个路口,生命实际上下降了几十个。有没有办法阻止这种情况?

无效的示例代码:

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

我知道这看起来很简单,但它整个星期都在干扰我的游戏。提前感谢您的任何帮助或建议!

【问题讨论】:

    标签: c# xna collision-detection intersection rectangles


    【解决方案1】:

    将您的条件更改为:

    (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,如果是真的,然后检查两个矩形是否相交。这将是更明智的表现。 :) +1
    • 天哪,非常感谢!那很完美!我有点愤怒,这是一件如此简单的事情哈哈。感激不尽!
    • @Zhafur:同意,但是还有其他处理这种情况的方法。我将附加一个编辑以反映一些优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2012-11-20
    • 2013-10-23
    • 2014-06-09
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多