1

基本的には、弾丸を撃つと弾丸が作成されます。ただし、弾丸がまだ画面に表示されている間にもう一度クリックすると、弾丸が削除され、まったく新しい弾丸が作成されます。そのため、一度に 1 つの弾丸しか画面に表示できません。これを修正するにはどうすればよいですか? ライブラリ内の弾丸のインスタンス名は「bullet」です

package
{



public class GameEnter extends MovieClip
{

    public function GameEnter()
    {
        addEventListener(MouseEvent.MOUSE_DOWN, shootBullet);
    }
    public var _bullet1:bullet = new bullet;
    public var angleRadian = Math.atan2(mouseY - 300,mouseX - 300);
    public var angleDegree = angleRadian * 180 / Math.PI;
    public var speed1:int = 10;

    public function shootBullet(evt:MouseEvent)
    {
        _bullet1.x = 300;
        _bullet1.y = 300;
        _bullet1.angleRadian = Math.atan2(mouseY - 300,mouseX -300);
        _bullet1.addEventListener(Event.ENTER_FRAME, bulletEnterFrame);
        addChild(_bullet1);
    }
    public function bulletEnterFrame(evt:Event) 
    {
        var _bullet1 = evt.currentTarget;
        _bullet1.x += Math.cos(_bullet1.angleRadian) * speed1;
        _bullet1.y += Math.sin(_bullet1.angleRadian) * speed1;
        _bullet1.rotation = _bullet1.angleRadian*180/Math.PI;
        if (_bullet1.x < 0 || _bullet1.x > 600 || _bullet1.y < 0 || _bullet1.y > 600) 
        {
            removeChild(_bullet1);
            _bullet1.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame);
        }
    }
}
}
4

1 に答える 1

2

よく考えてみてください。_bullet1 変数をクラスに保存しますが、これは問題ありませんが、撃つたびに同じ変数を使用し、x と y の位置を再度変更するだけです。

これを行うより良い方法は、弾丸クラス自体で弾丸のアニメーションを処理することです。

撃つときは、新しい弾丸を作成してステージに追加するだけです。

それでもこの方法を使用したい場合は、次のようにする必要があります。

public function shootBullet(evt:MouseEvent)
{
    var bullet:bullet = new bullet();
    bullet.x = 300;
    bullet.y = 300;
    bullet.angleRadian = Math.atan2(mouseY - 300,mouseX -300);
    bullet.addEventListener(Event.ENTER_FRAME, bulletEnterFrame);
    addChild(bullet);
}

public function bulletEnterFrame(evt:Event) 
{
    var tmpBullet:bullet = evt.currentTarget as bullet;
    tmpBullet.x += Math.cos(_bullet1.angleRadian) * speed1;
    tmpBullet.y += Math.sin(_bullet1.angleRadian) * speed1;
    tmpBullet.rotation = _bullet1.angleRadian*180/Math.PI;
    if (tmpBullet.x < 0 || tmpBullet.x > 600 || tmpBullet.y < 0 || tmpBullet.y > 600) 
    {
        removeChild(tmpBullet);
        tmpBullet.removeEventListener(Event.ENTER_FRAME, bulletEnterFrame);
    }
}

しかし、最良の方法はオプション1を使用することです

于 2012-06-19T02:55:36.983 に答える