对象列表上的XNA碰撞检测

本文关键字:XNA 碰撞检测 列表 对象 | 更新日期: 2023-09-27 17:58:11

我试图检测敌方对象列表上的碰撞,但它只处理最后创建的对象。我都试过了:

for (int i = 0; i < enemies.Count; i++)
{
    if (IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData))
    {
        touched = true;
    }
    else
    {
        touched = false;
    }
}

和:

foreach (Enemy enemy in enemies)
{
    if (IntersectsPixel(player.rectangle, player.textureData, enemy.rectangle, enemy.textureData))
    {
        touched = true;
    }
    else
    {
        touched = false;
    }
}

这两个我都放在Update方法中。敌人每隔几秒钟就会被制造出来,所以我知道检测是有效的,但一旦下一个出现,最后一个就会停止工作。。。

对象列表上的XNA碰撞检测

如果只检查最后一项,则必须中断循环,当IntersectsPixel为true并处理对象

for (int i = 0; i < enemies.Count; i++)
{
    if (IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData))
    {
        touched = true;
        break;
    }
}

或者使用linq来收集所有这样的对象:

var resTrue = enemies.Where(x=>x.IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData)).ToList();
var resFalse = enemies.Where(x=>!x.IntersectsPixel(player.rectangle, player.textureData, enemies[i].rectangle, enemies[i].textureData)).ToList();

为什么不在class Enemy中实现属性bool Touched

这样,你就可以这样修改你的代码:

if (/*check for collision*/)
    enemy.Touched = true;

更好的是,实现一个方法OnTouched(/*arguments*/)而不是Touched,这样您就可以这样做:

if (/*check for collision*/)
    enemy.OnTouched(/*arguments*/); // Which would perform any and all necessary actions on the touched object