2012-02-02 74 views
0

基本上我想要做的是将数组中的hitTest项目符号(通过addChild产生 - >推入数组)通过另一个包含船只的数组(通过addChild产生 - > push into a array as好)。hitTest与两个数组中的对象

目前我有:

function moveEnemyLarge():void{ 
    var target2:EnemyLarge; 

    for(var i2:int=0;i2<enemyShipArray.length;i2++){ 
     // Move each ship in the array down. 
     target2 = EnemyLarge(enemyShipArray[i2]); 
     target2.y += 0.5; 

     // Hit Test 
     if(target2.hitTestObject(PLACEHOLDER)){ 
      trace("SHIP HIT BULLET"); 
      removeChild(target2); 
      enemyShipArray.splice(i2,1); 
      i2--; 
     } 

     // Remove when off-stage. 
     if(target2.y > 700){ 
      removeChild(target2); 
      enemyShipArray.splice(i2,1); 
      i2--; 
     } 
    } 
} 

..和子弹一个几乎相同的功能(使用变量:我的目标)。 我最简单的方法是用我的ship数组中的对象来打击测试我的项目符号数组中的对象。将“目标”放在PLACEHOLDER插槽中不起作用,并且从我所看到的有些人将其中一个推到另一个中。

让我知道你是否需要任何进一步的代码或解释 - 我只是学习AS3的绳索,还没有学习一堆技巧!

回答

1

明显的解决方案将是2个循环。

for (var i:int = 0; i < ships.length; i++) { 
    var target:EnemyLarge = ships[i]; 
    target.y += .5; 
    for (var j:int = 0; j < bullets.length; j++) { 
    var bullet:Bullet = bullets[j]; 
    if (target.hitTestObject(bullet)) { 
     ships.splice(i,1); i--; 
     removeChild(target); 
    } 
    } 
} 

这一个是简单的学习项目确定的,但它有几个缺点:

  1. 从不(我说NEVER)修改你迭代的集合。稍后您将进行数小时的调试,试图了解正在发生的事情。
  2. 如果子弹或船只速度非常快,则子弹可以在一帧内穿过船只。在这种情况下,你可能想要测试的不仅仅是一颗子弹,而是从子弹的最后位置到当前位置的一条线。
  3. 如果你有很多子弹和船只,你会得到问题。在这种情况下,您将需要一些数据结构来比线性搜索更快地查询船上的子弹。
0

在您的设置中,您必须求助于循环内部的循环,以检查每艘船的每个子弹(或反之亦然)。内循环看起来是这样的:

for(var bullet:Bullet in bullets) { 
if(target2.hitTestObject(bullet)){ 
    trace("SHIP HIT BULLET"); 
    bullet.parent.removeChild(bullet); // remove the bullet 
    removeChild(target2); 
    enemyShipArray.splice(i2,1); 
    i2--; 
} 
} 

有几种方法可以替代解决这个问题。

  • 网格系统,其中每个小区只检查碰撞其孩子
  • 将所述游戏空间分成Y空间,如果存在对纯的碰撞,然后检查X轴碰撞
  • 像素查找其中子弹读取该船舶已创下
  • 一些颜色编码信息和其他一些人,我想不出现在
相关问题