-1

横スクロールアクション ゲームを作成しようとしていますが、現在、キャラクターが歩いたりジャンプしたりしています。これまでに 3 つの攻撃アニメーションがあり、ほぼ機能します。これは私が達成しようとしているものです。プレーヤーが攻撃ボタンを押すとキャラクターが攻撃し、プレーヤーが攻撃ボタンを押し続けると攻撃/パンチシーケンスが続行されるか、別の攻撃キーが押されると攻撃/蹴りのアニメーションを切り替えます (注: プレイヤーがキーを押したままにする必要はありません。キーを押す必要があります)。

また、現在の攻撃アニメーションの途中で次のフレームにジャンプするのではなく、現在の攻撃アニメーションが完全に終了したら、次の攻撃アニメーションに移動するにはどうすればよいですか。したがって、キャラクターが攻撃しているときに攻撃キーが押されている間、キャラクターは現在の攻撃アニメーションを終了し、終了するとすぐに次の攻撃アニメーション フレームに移動します。それ以外の場合は停止します。配列を作成するか、クラスを拡張する必要があるため、これを行う方法がわかりません。このようなゲームを作成したいのですが、コピーを見つけましたが、AS2 にあります

https://www.dropbox.com/s/zhf68zmi0ktmeqq/DD%20%282%29.zip

これは私がこれまでに行ったことです

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.utils.*;
    import com.greensock.TweenLite;
    import com.greensock.easing.*;
    import com.greensock.plugins.*;

    public class Player extends MovieClip
    {
        TweenPlugin.activate([BlurFilterPlugin]);
        //Player run speed setting;
        var RunSpeed:Number = 8;
        //Player key presses
        var RightKeyPress:Boolean = false;
        var LeftKeyPress:Boolean = false;
        var UpKeyPress:Boolean = false;
        //Jump variables
        var Gravity:Number = 1.5;
        var JumpPower:Number = 0;
        var CanJump:Boolean = false;
        var Jumped:Boolean = false;
        //Dash variable
        var Pressed:Boolean = false;
        var LastKeyPressed:Number = -1;
        var DashAmount:Number = 250;
        var DoubleTapDelay:Number = 260;//-- delay in milliseconds
        var Dashing:Boolean = false;
        var RightDash:Boolean = false;
        var LeftDash:Boolean = false;

        public function Player()
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDown);
            stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyPressed);
            addEventListener(Event.ENTER_FRAME,Update);
        }

        function KeyDown(event:KeyboardEvent)
        {
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, SecondDash);
            //If key is down cannot dash
            RightDash = false;
            LeftDash = false;

            //When Key is Down
            if (event.keyCode == 39)
            {
                RightKeyPress = true;
            }

            if (event.keyCode == 37)
            {
                LeftKeyPress = true;
            }

            if (event.keyCode == 38)
            {
                UpKeyPress = true;
            }
        }

        function KeyPressed(event:KeyboardEvent):void
        {
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyPressed);
            stage.addEventListener(KeyboardEvent.KEY_UP, KeyUp);

            //If on floor
            if (CanJump)
            {
                //If right key is down
                if (event.keyCode == 39)
                {
                    if (event.keyCode == 39 && Pressed)
                    {
                        //If right key press matches with recent right key press, dash right
                        Dashing = true;
                        RightDash = true;
                    }
                    Pressed = true;
                    setTimeout(function(){Pressed = false}, DoubleTapDelay);
                }

                if (event.keyCode == 37)
                {
                    if (event.keyCode == 37 && Pressed)
                    {
                        //If left key press matches with recent left key press, dash left
                        Dashing = true;
                        LeftDash = true;
                    }
                    Pressed = true;
                    setTimeout(function(){Pressed = false}, DoubleTapDelay);
                }

            }
        }



        function Update(event:Event)
        {

            //Adding gravity to the game world
            JumpPower +=  Gravity;
            //if player is more than 300 on the y-axis
            if (this.y > 300)
            {
                //Player stays on the ground and can jump
                JumpPower = 0;
                CanJump = true;
            }


                //If already jumped and on floor
                if (Jumped == true && CanJump)
                {
                    //Cannot jump again
                    CanJump = false;

                    //If on floor and right key is pressed run right
                    if ((RightKeyPress))
                    {
                        gotoAndStop('Run');
                        scaleX = 1;
                    }
                    else if ((LeftKeyPress))
                    {
                        //Otherwise if on floor and left key is pressed run left
                        gotoAndStop('Run');
                        scaleX = -1;
                    }

                    //If no key is pressed stay idle
                    if ((!RightKeyPress && !LeftKeyPress))
                    {
                        gotoAndStop('Idle');
                    }
                }


                //If on floor and can jump
                if (CanJump)
                {
                    //If right key is pressed run right
                    if ((RightKeyPress))
                    {
                        x +=  RunSpeed;
                        gotoAndStop('Run');
                        scaleX = 1;
                    }
                    else if ((LeftKeyPress))
                    {
                        //otherwise if left key is pressed run left
                        x -=  RunSpeed;
                        gotoAndStop('Run');
                        scaleX = -1;
                    }

                    if ((UpKeyPress))
                    {
                        //If up key is pressed then jump
                        JumpPower = -15;
                        CanJump = false;
                        gotoAndStop('Jump');
                        Jumped = true;
                    }

                    //If no key is pressed stay idle
                    if ((!RightKeyPress && !LeftKeyPress && CanJump))
                    {
                        gotoAndStop('Idle');
                    }
                }
                else if (CanJump == false)
                {
                    //Otherwise if in air and right key is pressed move right
                    if ((RightKeyPress))
                    {
                        x +=  RunSpeed;
                        scaleX = 1;
                    }
                    else if ((LeftKeyPress))
                    {
                        //Otherwise if left key is pressed then move left
                        x -=  RunSpeed;
                        scaleX = -1;
                    }
                }


                //If Dashing is true
                if (Dashing == true)
                {
                    //Dash right
                    if (RightDash == true)
                    {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, SecondDash);
                        stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyPressed);
                        TweenLite.to(this,0,{blurFilter:{blurX:1000}});
                        TweenLite.to(this,0.2,{blurFilter:{blurX:0},x:x + DashAmount,ease:Expo.easeOut});
                        Dashing = false;
                    }
                    else if (LeftDash == true)
                    {
                        //Otherwise dash left
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, SecondDash);
                        stage.removeEventListener(KeyboardEvent.KEY_DOWN, KeyPressed);
                        TweenLite.to(this,0,{blurFilter:{blurX:1000}});
                        TweenLite.to(this,0.2,{blurFilter:{blurX:0},x:x - DashAmount,ease:Expo.easeOut});
                        Dashing = false;
                    }
                }
                else if (Dashing == false)
                {
                    stage.removeEventListener(KeyboardEvent.KEY_DOWN, SecondDash);
                }


            this.y +=  JumpPower;
        }


        function SecondDash(event:KeyboardEvent)
        {
            stage.removeEventListener(KeyboardEvent.KEY_DOWN, SecondDash);

            if (event.keyCode == 38)
            {
                TweenLite.to(this,0,{blurFilter:{blurX:0}});
                TweenLite.to(this,0,{blurFilter:{blurY:1000}});
                TweenLite.to(this,0.5,{blurFilter:{blurY:0},y:y - DashAmount,ease:Expo.easeOut});
            }
        }

        function KeyUp(event:KeyboardEvent)
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressed);
            RightDash = false;
            LeftDash = false;

            if (event.keyCode == 39)
            {
                RightKeyPress = false;
            }

            if (event.keyCode == 37)
            {
                LeftKeyPress = false;
            }

            if (event.keyCode == 38)
            {
                UpKeyPress = false;
                Jumped = false;
            }
        }
    }
}
4

1 に答える 1

3

攻撃アニメーションを試みようとさえしていないようです...少なくとも私があなたのコードで見たものから。少なくとも自分で試してから投稿したかどうかを知ることは役に立ちますが、そうは言っても、いくつかの出発点を示します. また、このゲームをドキュメントクラスや他のクラスを使って作っているのか、タイムラインだけを使っているのか分かりませんが……以下はクラスの使い方になります。クラスを使用していない場合は...今すぐやめて、AS3 が実際に何であるかを学んでください。可能であれば、AS3 のタイムラインにコーディングしたくありません。

キー「1」、「2」、「3」で構成される 3 つの攻撃があるとします。var LeftDash:Boolean = Falseこれらの変数を他の変数と一緒に一番上に置きます...あなたがうまくいった直後に。(また、すべてvarprivate var.... に変更するだけでうまくいかない場合はpublic var、完全を期すために .... を使用してください)

private var attack1Boolean:Boolean = false;
private var attack2Boolean:Boolean = false;
private var attack3Boolean:Boolean = false;

次に、矢印キーのキーダウンとキーアップで行うのとほとんど同じことを行います。以下をKeyDownメソッド内のどこかに配置します。

if (event.keyCode == 49)
{
    attack1Boolean = true;
}
if (event.keyCode == 50)
{
    attack2Boolean = true;
}
if (event.keyCode == 51)
{
    attack3Boolean = true;
}

次に、KeyUpメソッドに次を追加します

if (event.keyCode == 49)
{
    attack1Boolean = false;
}
if (event.keyCode == 50)
{
    attack2Boolean = false;
}
if (event.keyCode == 51)
{
    attack3Boolean = false;
}

これで、攻撃の実装を開始する準備が整いました。攻撃用のアニメーションをすでに 3 つ作成したとします。これは、各攻撃に独自のタイムラインが必要であることを意味します (1 つのタイムラインに 3 つすべてを含めることもできますが、フレームで区切ることもできますが、これはお勧めしません)。やりたいことをする (次の攻撃が始まる前に各アニメーションを終了する) には、gotoAndStopまたはを使用する必要がありgotoAndPlayます。

アニメーションごとに新しい .as ファイルを作成すると便利です。3 つすべてのアニメーションを 1 つのタイムラインに結合している場合は、新しい .as ファイルを 3 つではなく 1 つ作成するだけで問題ありません。通常どおりにすべてのアニメーションをリンクします (方法がわからない場合はもう一度...もう一度)。 ...実際の AS3 チュートリアルを行ってください...あなたは先を行っています)。

これらの新しいクラス ファイルのインスタンスを作成する必要があるため、上部の vars の下に次のように記述します (新しいクラスAnimation1に名前を付ける場合はAnimation2...など)。

private var animation1:Animation1;
private var animation2:Animation2;
private var animation3:Animation3;

次に、関数Playerに入れます

animation1 = new Animation1();
animation2 = new Animation2();
animation3 = new Animation3();

これで、アニメーションを使用する準備が整いました。メソッドに移動しUpdate、次を追加します

//note, the animation1.currentFrame == 1 doesn't have to be 1...it's just the initial starting frame of the animation
if (attack1Boolean && 
    animation1.currentFrame == 1 &&
    animation2.currentFrame == 1 && 
    animation3.currentFrame == 1)
{
    animation1.x = //character.x if you have a class...this.x for yours
    animation1.y = //character.y if you have a class...this.y for yours
    addChild(animation1);
    attack1Boolean = false;
    if (animation1.currentFrame = //the last frame of animation1...a number)
    {
        animation1.gotoAndStop(1);
        removeChild(animation1);
    }
}

if (attack2Boolean && 
    animation1.currentFrame == 1 &&
    animation2.currentFrame == 1 && 
    animation3.currentFrame == 1)
{
    animation2.x = //character.x if you have a class...this.x for yours
    animation2.y = //character.y if you have a class...this.y for yours
    addChild(animation2);
    attack2Boolean = false;
    if (animation2.currentFrame = //the last frame of animation2...a number)
    {
        animation2.gotoAndStop(1);
        removeChild(animation2);
    }
}

if (attack3Boolean && 
    animation1.currentFrame == 1 &&
    animation2.currentFrame == 1 && 
    animation3.currentFrame == 1)
{
    animation3.x = //character.x if you have a class...this.x for yours
    animation3.y = //character.y if you have a class...this.y for yours
    addChild(animation3);
    attack3Boolean = false;
    animation3.gotoAndStop(1);
    if (animation3.currentFrame = //the last frame of animation3...a number)
    {
        animation3.gotoAndStop(1);
        removeChild(animation3);
    }
}

これでキャラクター アニメーションが開始され、他の攻撃が終了したら 1 つの攻撃しか使用できないようになります。また、アニメーションが独自のフレーム 1 で開始する必要があるという条件により、キーを押し続けてアニメーションを繰り返し開始する問題もほぼ修正されました (ただし、キーを押し続けるだけで攻撃が開始されます)。アニメーションが完成したら終了しますが、それは大きな問題ではないと思います...もしあれば教えてください)。

これをすべて試して、メモリからこれを行ったのでバグがいくつあるか教えてください。役立つ場合は賛成票を投じてください =)。

于 2013-08-15T12:38:08.680 に答える