-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 的时间线上编写代码。

假设我们有 3 次攻击,由键“1”、“2”和“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 和 keyup 执行几乎相同的操作。将以下内容放在您的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 个动画。这意味着每次攻击都应该有它自己的时间线(你可以在一个时间线上拥有所有 3 个,但也可以用帧分隔,但我不建议这样做)。为了做你想做的事(在下一次攻击发生之前完成每个动画),你必须使用gotoAndStopor gotoAndPlay

为每个动画创建一个新的 .as 文件是最有用的。如果您将所有 3 个动画合并到一个时间轴中...那很好,只需创建 1 个新的 .as 文件而不是 3 个。现在像您一样正常链接它们(如果您不知道如何执行此操作...再一次...去做一个真正的 AS3 教程...你已经超越了自己)。

您将必须创建这些新类文件的实例,因此在您的 vars 下方的顶部,放置以下内容(如果您命名新类Animation1Animation2...等)

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 帧开始的条件也解决了按住键并重复启动动画的问题(尽管您可以持续按住键,它会开始攻击动画完成后结束,但我认为这不是一个大问题......如果它让我知道)。

尝试所有这些,告诉我有多少错误,因为我是凭记忆这样做的,如果有帮助,请投票,=)。

于 2013-08-15T12:38:08.680 回答