我正在关注XNA教程并使用以下代码进行碰撞检测(检测子弹何时与目标发生碰撞)。基本上我想增加一个得分变量来显示屏幕的分数,而无需重新编写整个程序。无论我把它放在这个方法的哪个位置,它似乎从目标数量开始递增,而不是从零开始。这里有什么简单的东西吗?任何帮助将不胜感激。感谢。
private CollisionType CheckCollision(BoundingSphere sphere)
{
if (completeCityBox.Contains(sphere) != ContainmentType.Contains)
return CollisionType.Boundary;
for (int i = 0; i < targetList.Count; i++)
{
if (targetList[i].Contains(sphere) != ContainmentType.Disjoint)
{
targetList.RemoveAt(i);
i--;
AddTargets();
return CollisionType.Target;
}
}
return CollisionType.None;
}
答案 0 :(得分:2)
您可以简单地使用一个名为OnCollision()的单独方法来更新分数(如果您以后需要,可以为您执行任何物理操作),并且在您的Update方法中,只需要if语句检查冲突。类似的东西:
if( CheckCollision() == CollisionType.Target )
{
OnCollision();
}
希望有所帮助。
雷
答案 1 :(得分:0)
假设你没有在任何其他地方递增/分配得分变量,并且在初始化期间将其设置为零,我唯一可以想到的另一件事就是你以某种方式触发了与所有对象的碰撞 - 是可能在某种程度上,也许在设置阶段?您是否尝试在分数增量线上设置断点以查看它何时被击中?
答案 2 :(得分:0)
如果你在类的顶部初始化它,并且只在第二个if语句中递增它,那么听起来第一次所有项目都必须发生碰撞。
没有剩下的代码可能很难确定,但是例如在AddTargets函数中,如果它们以相同的位置开始,然后进行调整,则可能在检查到此碰撞时它们都是合格的,或者某些东西那种性质。
如上所述,要么在更新分数时设置断点 - 如果需要,请通过属性更新它并在属性上设置断点,以便查看其被调用的位置并跟踪其被调用的原因。如果它在你真正拥有你想要的碰撞之前从0到250,那么应该很容易找到错误地更新计数器的位置,因为它听起来发生在你预期的第一次碰撞之前,因此加上前250分。