0

そのため、私のゲームでは、敵の追跡と更新などのために敵の配列を使用しています。ただし、プレイヤーが敵に衝突すると、そのゲームですが、プレイヤーが敵に命中する弾丸を撃つと、敵は削除されます. しかし、弾丸が敵である場合、弾丸は削除されますが、何らかの理由でオブジェクトがまだ更新されていて、プレイヤーに衝突する可能性がありますか?

これを止めるにはどうすればよいですか?

これは、衝突をチェックするためにレーザークラスにあるコードです

private function loop(e:Event) : void
{
    //move bullet up
    y -= bulletSpeed;

    if (y < 0)
    {
        removeSelf();
    }

    for (var i:int = 0; i < AvoiderGame.enemyArray.length; i++)
    {
        if (hitTestObject(AvoiderGame.enemyArray[i]))
        {
            AvoiderGame.enemyArray[i].takeHit();
            removeSelf();
        }
    }
}

これが、敵のクラスにあるすべてのコードです。

package 
{

import flash.display.MovieClip;
import flash.display.Stage;

public class Enemy extends MovieClip
{
    private var stageRef:Stage;

    public function Enemy(startX:Number, startY:Number, stageRef:Stage)
    {
        this.stageRef = stageRef;
        x = startX;
        y = startY;
    }       
    public function moveDown():void
    {
        y = y + (1 + (10 - 1) * Math.random());
        switch(Math.round(1 + (2 - 1) * Math.random()))
        {
            case 1: x = x + (1 + (10 - 1) * Math.random());
                    break;
            case 2: x = x - (1 + (10 - 1) * Math.random());
                    break;
        };
    }

    public function StayOnScreen():void
    {
        if  (x <= 0)
        {
            x = 0;
        }
        else if (x >= stageRef.stageWidth)
        {
            x = stageRef.stageWidth;
        }
        else
        {
            x = x;
        }
    }

    private function removeSelf() : void
    {
        if (stageRef.contains(this))
        {
            this.parent.removeChild(this);
            delete AvoiderGame.enemyArray[this];
        }

    }

    public function takeHit() : void
    {
        removeSelf();
    }
    }
}

これがメインゲームにあるすべてのコードです。

package
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
import com.freeactionscript.CollisionTest;
import flash.display.Stage;
import flashx.textLayout.formats.BackgroundColor;

public class AvoiderGame extends MovieClip
{
    public static var enemyArray:Array;
    public var enemy:Enemy
    public var Background:gameBackground;

    public var avatar:Avatar;
    public var gameTimer:Timer;

    private var _collisionTest:CollisionTest;
    private var numStars:int = 80;

    private var fireTimer:Timer; //causes delay between fires
    private var canFire:Boolean = true; //can you fire a laser

    public function AvoiderGame()
    {
        Background = new gameBackground();
        addChild(Background);

        enemyArray = new Array();
        var enemy = new Enemy(Math.round(1 + (500 - 1) * Math.random()), - 2, stage);
        enemyArray.push(enemy);
        addChild(enemy);

        avatar = new Avatar(stage);
        addChild(avatar);

        avatar.x = stage.stageWidth / 2;
        avatar.y = stage.stageHeight / 2;

        for (var i:int = 0; i < numStars; i++)
        {
            stage.addChildAt(new Star(stage), 1);
        }

        _collisionTest = new CollisionTest();

        gameTimer = new Timer(25);
        gameTimer.addEventListener(TimerEvent.TIMER, onTick);
        gameTimer.start();

        fireTimer = new Timer(300, 1);
        fireTimer.addEventListener(TimerEvent.TIMER, fireTimerHandler, false, 0, true);
        fireTimer.start();

    }

    public function onTick(timerEvent:TimerEvent):void 
    {
        if (Math.random() < 0.1)
        {
            var enemy = new Enemy(Math.round(1 + (500 - 1) * Math.random()), - 28, stage);
            enemyArray.push(enemy);
            addChild(enemy);
        }

        avatar.UpdateAvatar(canFire);
        if (canFire == true)
        {
            canFire = false;
            fireTimer.start();
        }
        avatar.StayOnScreen();

        for each (var enemy:Enemy in enemyArray)
        {
            enemy.moveDown();
            enemy.StayOnScreen();
            if (_collisionTest.complex(enemy, avatar)) 
            {
                gameTimer.stop();
            }
        }
    }
    private function fireTimerHandler(e:TimerEvent) : void
    {
        //timer ran, we can fire again.
        canFire = true;
    }
}

removeSelf() 関数を使用して敵のクラスでおそらく間違っていることは理解していますが、これを修正するにはどうすればよいですか?

あなたが欲しくないなら、私のウェブサイトにこのゲームのプレイ可能な例があり、スペースを使用して敵を撃破しますが、それはまだゲーム内にありますか?

http://dynamite-andy.co.uk/projects/free-time/as3-avoider-game/

4

1 に答える 1

0

問題は、removeSelf()メソッドの次の行にあるようです。

delete AvoiderGame.enemyArray[this];

から何かを削除するには、キーワードではなく配列を変更するArray クラス メソッドArrayを使用する必要があります。delete

[編集] この場合、splice()を使用して、配列から敵を削除できます。

var enemyIndex:int = this.parent.getChildIndex(this);
this.parent.removeChild(this);
AvoiderGame.enemyArray.splice(enemyIndex, 1);
于 2012-11-18T17:36:19.147 に答える