你如何检测两个阵列之间的冲突?

时间:2013-12-13 22:37:20

标签: actionscript-3 flash

对于未来的参考,这是最终的代码

for each (var bullet:Bullet in bulletList)
{
    for each (var zombie:Zombie in zombieList)
    {
        if (zombie.hitTestObject(bullet))
        {
            stage.removeChild(bullet);
            zombie.zombieShot(50);
        }

    }
}   

下面的原始问题

 for each (var bullet:Bullet in bulletList)
{
    if (zombieList.length > 0)
    {
        if (zombieList[h].hitTestObject(bullet))
        {
            bulletList[i].deleteBullet();
            zombieList[h].zombieShot(50);
        }
    }
}

这是我的代码,但它只检测我产生的第一个僵尸,感谢任何帮助。

if (countMePls<10)
{
    countMePls++;
    var zombie:Zombie = new Zombie(stage,Math.random() * stage.width,Math.random()*stage.height);
    zombie.addEventListener(Event.REMOVED_FROM_STAGE,zombieRemoved,false,0,true);
    zombieList.push(zombie);
    stage.addChild(zombie);
}

然后......

function shootBullet():void
{
var bullet:Bullet = new Bullet(stage,Main.player.x,Main.player.y,Main.player.rotation - 90);
bullet.addEventListener(Event.REMOVED_FROM_STAGE,bulletRemoved,false,0,true);
bulletList.push(bullet);
stage.addChildAt(bullet,1);
}

这最后一位是Bullet.as

public function deleteBullet():void
    {
        this.parent.removeChild(this)
    }

1 个答案:

答案 0 :(得分:1)

我认为您的问题来自对forfor each的一些基本混淆。对于每个都没有索引变量,每次迭代都会在集合中生成一个类型的新实例,该实例由您在循环中声明的名称引用。在这种情况下是;

  foreach (var bullet in bulletsList)
  {
      // do something with bullet
  }

你可能真的想要一个嵌套循环,它会检查每个僵尸对每个僵尸是否有点击,实际上看起来像这样;

  foreach (var bullt in bulletsList)
  {
       foreach (var zombie in zombiesList)
       {
             if (zombie.hitTestObject(bullet))
             {
                     bulletList.Remove(bullet);
                     zombie.zombieShot(50);
             }
       }
  }

在你的代码中,你有foreach循环给你当前的bullet对象,但是你永远不会在循环中引用它,这没有意义。这可能不是您想要的,但希望它会让您朝着正确的方向前进。如果你想使用那些索引器,那么你需要像

这样的东西
  for (int i = 0; i < bulletsList.Length; i++)
  {
       for (int h = 0; h < zombiesList.Length; h++)
       {
            // do stuff with bulletsList[i] and zombiesList[h]
       }
  }

注意:这最初标记为C#,我发布的代码使用C#语法。我提供的解释很可能适用于任何一种方式,OP的代码在我所知的任何语言中都没有意义,原因是相同的。