0

AS3で作られた基本的なスペースシューティングゲームがあります。

ゲームは現在、1人の敵とプレイヤー(可動タレット)で構成されています。

ゲームの前提は、敵が撃たれるとリスポーンし、プレイヤーのスコアが1ポイント上がることです。

今、私は競技場に複数の敵を置くことによってゲームを拡張したいと思います。敵の数は波ごとに異なる可能性があるので、私は実際にそれらを個別に追跡したくありません。

敵を作りたいときは(メインクラス内から)電話します

this.addChild(createNewEnemy());

createNewEnemy()関数を使用して、匿名のEnemyオブジェクトを作成して返します。

私の質問は、これらの匿名の敵に対して、プレイヤーが弾丸を発射してヒットテストを実行するにはどうすればよいですか?敵が弾丸に衝突した場合、それを取り除き、スコアを増やす必要があります。

4

2 に答える 2

1

「匿名オブジェクト」の意味がよくわかりません。追跡できるような方法でこれらのものを作成する必要があります。1 つの方法は、コンテナ スプライトの addChild メソッドをオーバーライドして、新しい敵をベクターにプッシュすることです。例:

var enemies:Vector.<Enemy> = new Vector.<Enemy>();

override public function addChild(child:DisplayObject):DisplayObject
{
    if(child is Enemy) {
       enemies.push(child);
    }
    super.addChild(child);
}

これで、敵のベクトルに対して単純にテストするかis、弾丸の衝突で同じ " " キーワードを使用して、衝突している表示オブジェクトがベース タイプであるかどうかを確認できますEnemy

衝突検出を行う実際のコードに関しては、次の回答を参照してください: https://stackoverflow.com/a/7083965/562566

于 2012-04-24T22:14:38.247 に答える
1

こんにちは!

「匿名」の意味がよくわかりませんが、解決策の1つは、いわゆるヒットボックスを作成することです。

Enemy クラスがあるとします。

public class Enemy {
    public var hitBox:Sprite = new Sprite() ;

    public function Enemy() {
        hitBox.graphics.clear() ; /* Not filled by a color, as needs to be invisible */
        hitBox.graphics.drawRect(x,y,width,height) ; /* Adjust the parameters manually */
        this.addChild(hitBox) ;
    }
}

敵が多いので、enemyArrayを作って敵を押し込むだけ。そして、ここにプレーヤーの弾丸があります:

public class PlayerBullet extends Sprite {
    private var stageReference:Stage ;
    public function PlayerBullet(coord:Point, stageReference:Stage){
        this.x = coord.x ;
        this.y = coord.y ;
        this.stageReference = stageReference ;
        this.stageReference.addChild(this) ;
        this.addEventListener(Event.ENTER_FRAME, loop) ;
    }

    private function loop(e:Event){

        /*Provide some movement for bullet by changing or incrementing
          this.x and this.y as you wish */

        for (var i:Number = 0 ; i < enemyArray.length ; i++){
          if (this.hitTestObject(enemyArray[i].hitBox)) {
              enemyArray.splice(i,1) ; /* Remove the enemy from enemy array on collision */
              this.stageReference.removeChild(this) ; /* Do not display bullet anymore on collision with enemy */
          }
       }
    }
}

注: ヒットボックスは正方形の領域しか提供しません。衝突の正確な詳細が必要な場合は、いくつかのヒットボックスを作成してください。

これが役立つことを願っています!:)

于 2012-04-25T00:09:56.083 に答える