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

最後の項目のみをチェックし、IntersectsPixeltrue の場合はループを中断してオブジェクトを処理する必要があります

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 Touchedでプロパティを実装してみませんclass Enemyか?

そうすれば、次のようにコードを変更できます。

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

さらに良いことに、 の代わりにTouchedmethod を実装して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 に答える