在FlxG.collide()回调函数:从一个组中杀死一个项目会杀死该组的其余部分

时间:2012-05-15 16:33:48

标签: actionscript-3 flash debugging flixel

我有英雄投掷的剑(考虑它们的子弹),当它击中瓷砖地图时,使用kill()方法杀死剑(子弹)。 但意外的事情发生了。当使用kill()时,exists = false或者visible = false所有组都已消失(被杀或不可见)。
这些是一些片段:

Sword.as(base class for all swords) shoot function :
public function shoot(playerPosition:FlxPoint, direction:uint):void{
  if(!alive || !exists){
    revive();
  }
  x = playerPosition.x;
  y = playerPosition.y;
  if(direction == FlxObject.RIGHT) {                
    angularVelocity = 900;
    velocity.x = 400;
  } else {
    angularVelocity = 900;
    velocity.x = -400;
  }
}

Sword(BasicSword)的子类只有剑图形,因此不值得一提。

PlayState.as   
create (only part of it):       

for(var i:int = 0; i < 15;i++) {
  sword = new BasicSword(-200, -200);
  swords.add(sword);
}
add(swords);

更新

override public function update():void{
  if(FlxG.keys.justPressed("X")) {
    (swords.recycle(BasicSword) as BasicSword).shoot(new FlxPoint(player.x,
      player.y),player.facing);
  }

  super.update();
  FlxG.collide(level, player);//make the player stand on the level.
  FlxG.collide(level, swords, swordsHitLevel);
}

swordsHitLevel(callback function):
public function swordsHitLevel(level:FlxTilemap, sword:FlxSprite):void {
  sword.kill();         
}

1 个答案:

答案 0 :(得分:0)

这是因为你正在检查tilemap和'swords'组之间的碰撞,而不是剑的insance。这样,如果任何剑与tilemap发生碰撞,则为该组调用swordsHitLevel,而不是单个剑

你可能想要通过剑精灵进行迭代

for(var sword:BasicSword in swords.children() ){
    FlxG.collide(level, sword, swordsHitLevel);
}

(代码未经过测试,如果需要,我可以稍后给你一个工作片段)

编辑:我今天自己陷入了这个问题。虽然我确信每个成员而不是FlxGroup调用了回调,但碰撞函数在某些情况下返回了误报,但我没有找到原因或何时。可能是一个错误。我用Google搜索并找到了这篇文章。具有讽刺意味的是,我已经回答了所以我解决了这个问题。这次代码经过测试并正常工作

        for ( var i:int = 0; i < swords.members.length; i++ ) { 
            try{
                var sword:BasicSword= (BasicSword)(swords.members[i]);
                FlxG.collide(this.map, sword, swordsHitLevel);

            }catch (err:Error){}
        }