0

enterFrame から timerEvent 関数を呼び出しています。everyFrame で timerEvent 関数を実行しています。それを制御する方法はありますか?

timerEvent が 500 の弾丸発射機能があるので、24fps で 0.5 秒ごとに弾丸を発射します。今のところ問題なく動作しています。次に、武器に関して弾速とスキンを変更したいと思います。

////////////////////////////////
//this function is called first time within an EnterFrame function
///////////////////////////////



function weaponCheck():void
{
switch (weaponState)
{
    case STATE_GUN :
        gun();
        break;
    case STATE_DOUBLE_GUN :
        doubleGun();
        break;
    }
}


function gun():void
{
trace("single gun");
laserTimer = new Timer(600);
laserTimer.addEventListener(TimerEvent.TIMER, timerListener);
laserTimer.start();
function timerListener(e:TimerEvent):void
{
    var tempLaser:MovieClip = new Laser();
    var tempGunBlast:MovieClip = new Gun_blast_01();
    tempLaser.x = player.x +((player.width/2)+12);
    tempLaser.y = player.y;

    tempGunBlast.x = stage.mouseX + 104;
    tempGunBlast.y = tempLaser.y;
    Lasers.push(tempLaser);
    addChildAt(tempLaser,1);
    addChildAt(tempGunBlast, 3);

    if (tempGunBlast.currentFrame >= tempGunBlast.totalFrames)
    {
        removeChild(tempGunBlast);
    }

    }

}

function doubleGun():void
{
trace("Double gun");
doubleGunTimer = new Timer(400);
doubleGunTimer.addEventListener(TimerEvent.TIMER, timerListener2);
doubleGunTimer.start();
function timerListener2(e:TimerEvent):void
{
    var tempLaser:MovieClip = new doubleG();
    var tempGunBlast:MovieClip = new Gun_blast_01();
    tempLaser.x = player.x +((player.width/2)+12);
    tempLaser.y = player.y;

    tempGunBlast.x = stage.mouseX + 104;
    tempGunBlast.y = tempLaser.y;
    Lasers.push(tempLaser);
    addChildAt(tempLaser,1);
    addChildAt(tempGunBlast, 3);

    if (tempGunBlast.currentFrame >= tempGunBlast.totalFrames)
    {
        removeChild(tempGunBlast);
    }
}
}



///////////////////////////////////////////////////
//Following function is called within an enterFrame event function
/////////////////////////////////////////////////

function playGame():void
{
weaponCheck();
blah1();
blah2();
blah3();
testForEnd();
}




function testForEnd():void
{

if (level == 3)
{
    laserTimer.stop();
    weaponState = STATE_DOUBLE_GUN;
    weaponCheck();
}


}

そのため、ゲームが初めて実行されるときは正常に動作し、600 のタイマー イベントを使用して弾を撃ちますが、レベル == 3 で WeaponState が変化すると、2 回目の発射関数 doubleGun(); が実行されます。が呼び出されますが、制御された timerEvent ではなく、フレームごとのカウントで弾丸の発射を開始します。助けてください。ありがとう。

4

1 に答える 1

1

タイマーを落とし、時間をカウントする方法としてフレームリスナーを使用してみませんか?すでにweaponCheck()エンターフレームリスナーから呼び出しています。実際の呼び出しgun()doublegun()呼び出しが、firin'mah lazersやblastsなどのアニメーションのみを生成し、main関数が時間をカウントするようにします。

function weaponCheck():void
{
    this.reloading+=this.weaponFiringSpeed; // you alter this to make your weapon fire slower or faster
    if (this.reloading<FULLY_RELOADED) return; // we are not yet ready to fire
    this.reloading=0;
    switch (weaponState) // and here we fire with the gun state
    {
        case STATE_GUN :
            gun();
            break;
        case STATE_DOUBLE_GUN :
            doubleGun();
            break;
    }
}

function gun():void
{
    trace("single gun");
    var tempLaser:MovieClip = new Laser();
    var tempGunBlast:MovieClip = new Gun_blast_01();
    tempLaser.x = player.x +((player.width/2)+12);
    tempLaser.y = player.y;
    tempGunBlast.x = stage.mouseX + 104;
    tempGunBlast.y = tempLaser.y;
    Lasers.push(tempLaser);
    addChildAt(tempLaser,1);
    addChildAt(tempGunBlast, 3);
}

そして同様にダブルガン。FULLY_RELOADEDは定数でreloadingあり、時間を追跡するために使用される変数であり、発砲している人のプロパティである必要があります。

このアプローチでは、「tempGunBlast」を他の場所、おそらくweaponCheck関数自体で管理する必要があることに注意してください。その場合は、次のように変更します。

function weaponCheck():void
{
    if (tempGunBlast) if (tempGunBlast.currentFrame >= tempGunBlast.totalFrames)
        removeChild(tempGunBlast);
    this.reloading+=this.weaponFiringSpeed; // you alter this to make your weapon fire slower or faster
    if (this.reloading<FULLY_RELOADED) return; // we are not yet ready to fire
    ... // rest of code unchanged

ほとんどの場合、これをコピーパステルで実装することはできませんが、試してみてください。

于 2012-12-18T11:15:07.113 に答える