【问题标题】:XNA Collision detection on a list of objects对象列表上的 XNA 碰撞检测
【发布时间】:2013-02-06 22:18:40
【问题描述】:

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

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

【问题讨论】:

    标签: c# for-loop foreach xna collision-detection


    【解决方案1】:

    你只检查最后一项,你必须打破循环,当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();
    

    【讨论】:

    • 使用 linq 示例并处理组中的所有项目
    • 一句话...感谢您的帮助:)
    【解决方案2】:

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多