0

我有英雄投掷的剑(考虑它们是子弹),当它击中瓷砖地图时,剑(子弹)被使用kill()方法杀死。但是意想不到的事情发生了。使用时kill(),exists = false 或 visible = false ALL OF THE GROUP IS GONE (killed or invisible)。
这些是一些片段:

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();         
}
4

1 回答 1

0

发生这种情况是因为您正在检查 tilemap 和 'swords' 组之间的碰撞,而不是剑的 insance。这样,如果任何剑与瓷砖地图发生碰撞,则为组调用swordsHitLevel,而不是单个剑

你可能想遍历剑精灵

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

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

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

        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){}
        }   
于 2012-08-14T06:46:50.620 回答