简体   繁体   English

对象列表上的XNA碰撞检测

[英]XNA Collision detection on a list of objects

I'm trying to detect collision on a list of enemy objects, however it's only working on the last created object. 我正在尝试检测敌人对象列表上的碰撞,但是它仅适用于最后创建的对象。 I've tried both : 我都尝试过:

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;
    }
}

And : 和:

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

Both of which I'm putting in the Update method. 两者都放在Update方法中。 The enemies are created every few seconds so i know the detection works, but once the next one appears, the last one stops working... 每隔几秒钟就会创建一次敌人,因此我知道检测有效,但是一旦出现下一个,最后一个就会停止工作...

you check last item only, you must break loop, when IntersectsPixel true and process the object 仅检查最后一项,当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;
    }
}

or use linq to collect all thus objects: 或使用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();

Why don't you implement a property bool Touched in class Enemy ? 为什么不在class Enemy实现属性bool Touched

That way, you could change your code like this: 这样,您可以像这样更改代码:

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

Better yet, instead of Touched , implement a method OnTouched(/*arguments*/) , so you can do this: 更好的是,代替Touched ,实现方法OnTouched(/*arguments*/) ,因此您可以这样做:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM