0

我正在尝试检测敌人对象列表上的碰撞,但它仅适用于最后创建的对象。我都试过了:

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 方法中。每隔几秒钟就会创建一次敌人,所以我知道检测有效,但是一旦下一个出现,最后一个就会停止工作......

4

2 回答 2

4

你只检查最后一项,你必须打破循环,IntersectsPixel当真并处理对象

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();
于 2013-02-06T13:48:25.920 回答
2

你为什么不实现一个属性bool Touchedin class Enemy

这样,您可以像这样更改代码:

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

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

if (/*check for collision*/)
    enemy.OnTouched(/*arguments*/); // Which would perform any and all necessary actions on the touched object
于 2013-02-06T14:18:40.223 回答