Actionscript 3 如何让我的角色冲刺-双按键

Actionscript 3 如何让我的角色冲刺-双按键,actionscript-3,Actionscript 3,我正在创造一个击败他们的游戏,到目前为止,我已经让这个角色跑和跳。我现在想让我的角色向左或向右冲刺。因此,如果玩家向右键,向右键的速度非常快,那么角色就会冲刺。我怎样才能做到这一点。这就是我到目前为止所做的 package { import flash.display.MovieClip; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard;

我正在创造一个击败他们的游戏,到目前为止,我已经让这个角色跑和跳。我现在想让我的角色向左或向右冲刺。因此,如果玩家向右键,向右键的速度非常快,那么角色就会冲刺。我怎样才能做到这一点。这就是我到目前为止所做的

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class Player extends MovieClip
    {
        //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;

        public function Player()
        {
            // constructor code
            stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyPressed);
            addEventListener(Event.ENTER_FRAME,Update);
            stage.addEventListener(KeyboardEvent.KEY_UP,KeyReleased);
        }

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

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

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

        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 on floor
            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)
            {
                //Other 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 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');
                }
            }

            this.y +=  JumpPower;
        }

        function KeyReleased(event:KeyboardEvent)
        {
            if (event.keyCode == 39)
            {
                event.keyCode = 0;
                RightKeyPress = false;
            }

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

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

所以我做了一个小测试,得出了这个结论。它现在似乎运行得很好。我还没有测试过它的极限长度,但它可以让你开始。我将把它留给您在自己的代码中实现。只需复制/粘贴到新的AS3文档中,然后观看控制台

import flash.events.KeyboardEvent;

stage.addEventListener(KeyboardEvent.KEY_UP, keyPressed);

var pressed         :Boolean = false;
var lastKeyPressed  :Number = -1;
var doubleTapDelay  :Number = 260; //-- delay in milliseconds


function keyPressed(e:KeyboardEvent):void
{
    if (lastKeyPressed == e.keyCode && pressed) trace("double tapped " + e.keyCode);
    lastKeyPressed = e.keyCode;
    pressed = true;
    setTimeout(function(){pressed = false},doubleTapDelay); 
}
编辑以在按键按下时使用 这似乎在按下
键时效果更好

import flash.events.KeyboardEvent;

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);

var pressed         :Boolean = false;
var lastKeyPressed  :Number = -1;
var doubleTapDelay  :Number = 260; //-- delay in milliseconds


function keyPressed(e:KeyboardEvent):void
{
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp);
    if (lastKeyPressed == e.keyCode && pressed) trace("double tapped " + e.keyCode);
    lastKeyPressed = e.keyCode;
    pressed = true;
    setTimeout(function(){pressed = false},doubleTapDelay); 
}

function onKeyboardUp(e:KeyboardEvent):void
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}
为演示再次编辑

演示:

资料来源:


我建议你把以前的按键储存在某个地方,然后你可以把它与你的“如果在地板上”例行程序联系起来,测试双按键。最后一件事,是不是可以让它按向下键而不是向上键。我理解为什么它在向上键时工作得更好,因为如果向下键,它将在一个内循环中发射,但有没有办法解决这个问题,唯一的问题是,如果你按住它,它将继续发射。我想您可以删除按键向下事件监听器,添加一个按键向上监听器,然后在按键向上时,读取按键向下事件监听器。您认为这会更容易些吗。第一次按上键,第二次按下键。嘿,试试我的编辑。我认为,如果按下
,这个解决方案会更有效,就像您要求做的一样。我添加了更多的功能,并用一些粗花呢做了一个小演示。签出,源FLA:
使用箭头键
import flash.events.KeyboardEvent;
import com.greensock.TweenLite;
import com.greensock.easing.*;
import com.greensock.plugins.*;

TweenPlugin.activate([BlurFilterPlugin]);


stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_DOWN, permaKeyDown);

var pressed         :Boolean = false;
var lastKeyPressed  :Number = -1;
var dashAmount      :Number = 50;
var doubleTapDelay  :Number = 260; //-- delay in milliseconds

function permaKeyDown(e:KeyboardEvent):void
{
    switch (e.keyCode)
    {
        case 38: //-- up arrow
            char.y = char.y - 2;
            break;
        case 39: //-- right arrow
            char.x = char.x + 2;
            break;
        case 40: //-- down arrow
            char.y = char.y + 2;
            break;
        case 37: //-- left arrow
            char.x = char.x - 2;
            break;
    }
}

function keyPressed(e:KeyboardEvent):void
{
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp);
    if (lastKeyPressed == e.keyCode && pressed)
    {
        trace("double tapped " + e.keyCode);
        doDash(e.keyCode);
    }
    lastKeyPressed = e.keyCode;
    pressed = true;
    setTimeout(function(){pressed = false}, doubleTapDelay);    
}

function onKeyboardUp(e:KeyboardEvent):void
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}

function doDash(keyCode:Number):void
{
    switch (keyCode)
    {
        case 38: //-- up arrow
            TweenLite.to(char,0,{blurFilter:{blurY:50}});
            TweenLite.to(char,0.3,{blurFilter:{blurY:0},y:char.y - dashAmount,ease:Expo.easeOut});
            break;
        case 39: //-- right arrow
            TweenLite.to(char,0,{blurFilter:{blurX:50}});
            TweenLite.to(char,0.3,{blurFilter:{blurX:0},x:char.x + dashAmount,ease:Expo.easeOut});
            break;
        case 40: //-- down arrow
            TweenLite.to(char,0,{blurFilter:{blurY:50}});
            TweenLite.to(char,0.3,{blurFilter:{blurY:0},y:char.y + dashAmount,ease:Expo.easeOut});
            break;
        case 37: //-- left arrow
            TweenLite.to(char,0,{blurFilter:{blurX:50}});
            TweenLite.to(char,0.3,{blurFilter:{blurX:0},x:char.x - dashAmount,ease:Expo.easeOut});
            break;
    }
}