0

ヒーローが投げる剣 (弾丸と考えてください) があります。タイルマップにヒットすると、メソッドを使用して剣 (弾丸) が殺されkill()ます。しかし、予想外のことが起こりました。を使用する場合kill()、exists = false または visible = false ALL OF THE GROUP IS GONE (killed または 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

これは、sword insanceではなく、タイルマップと「swords」グループ間の衝突をチェックしているために発生します。このように、剣のいずれかがタイルマップと衝突した場合、swordsHitLevelは、個々の剣ではなく、グループに対して呼び出されます。

剣のスプライトを繰り返し処理することをお勧めします

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

(コードはテストされていません。必要に応じて、後で実用的なスニペットを提供できます)

編集:私は今日この問題に自分自身で陥りました。コールバックはFlxGroupではなくメンバーごとに呼び出されたと確信していますが、collide関数が誤検知を返す場合がありましたが、その理由と時期がわかりませんでした。バグの可能性があります。私はグーグルでこの投稿を見つけました。皮肉なことに、私はすでにそれに答えていました。だから私はそれを回避しました。今回はコードがテストされ、機能しています

        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 に答える