Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 除非之前按下运行按钮,否则按下运行按钮不会提高速度_Actionscript 3_Flash_Actionscript_Air_Cs3 - Fatal编程技术网

Actionscript 3 除非之前按下运行按钮,否则按下运行按钮不会提高速度

Actionscript 3 除非之前按下运行按钮,否则按下运行按钮不会提高速度,actionscript-3,flash,actionscript,air,cs3,Actionscript 3,Flash,Actionscript,Air,Cs3,我在游戏中跑步的方式是,它检测到你点击了跑步按钮,这是一个Movieclip,然后它设置了增加的步行速度。如果您抬起手指或将其从按钮上移开,它会将其还原为默认的行走速度 因此,问题在于,只有在定向DPAD之前按下run按钮时,run按钮才起作用 我该如何解决这个问题 我的运动课 package { import flash.display.Stage; import flash.display.MovieClip; import flash.events.Event;

我在游戏中跑步的方式是,它检测到你点击了跑步按钮,这是一个Movieclip,然后它设置了增加的步行速度。如果您抬起手指或将其从按钮上移开,它会将其还原为默认的行走速度

因此,问题在于,只有在定向DPAD之前按下run按钮时,run按钮才起作用

我该如何解决这个问题

我的运动课

package 
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TouchEvent;
    import flash.net.dns.AAAARecord;
    import flash.ui.Multitouch;
    import flash.ui.MultitouchInputMode;


    public class Movement extends MovieClip
    {
        public function Movement(main:Game)
        {
            trace("SUCCESS | Constructed Movement Class");

            addChild(Game.playerPosKeeper_mc);
            Game.playerPosKeeper_mc.x = 384;
            Game.playerPosKeeper_mc.y = 46;

            addChild(main.up_dpad);
            main.up_dpad.x = 55;
            main.up_dpad.y = 336;

            addChild(main.down_dpad);
            main.down_dpad.x = 57;
            main.down_dpad.y = 432;

            addChild(main.left_dpad);
            main.left_dpad.x = 19;
            main.left_dpad.y = 372;

            addChild(main.right_dpad);
            main.right_dpad.x = 118;
            main.right_dpad.y = 372;

            addChild(main.menu_dpad);
            main.menu_dpad.x = 61;
            main.menu_dpad.y = 377;

            addChild(main.run_dpad);
            main.run_dpad.x = 684;
            main.run_dpad.y = 369;

            addChild(main.barrierRoof1_game);
            main.barrierRoof1_game.x = 0;
            main.barrierRoof1_game.y = 0;

            addChild(main.barrierRoof2_game);
            main.barrierRoof2_game.x = 0;
            main.barrierRoof2_game.y = 470;

            addChild(main.barrierRoof3_game);
            main.barrierRoof3_game.x = 0;
            main.barrierRoof3_game.y = 320;

            addChild(main.barrierSide1_game);
            main.barrierSide1_game.x = 0;
            main.barrierSide1_game.y = 0;

            addChild(main.barrierSide2_game);
            main.barrierSide2_game.x = 790;
            main.barrierSide2_game.y = 0;

            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

            main.run_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBeginRUN);
            main.run_dpad.addEventListener(TouchEvent.TOUCH_OUT, onTouchEndRUN);
            main.run_dpad.addEventListener(TouchEvent.TOUCH_END, onTouchEndRUN);

            function onTouchBeginRUN(e:TouchEvent):void
            {
                Game.upWalkspeed = -5;
                Game.downWalkspeed = 5;
                Game.leftWalkspeed = -5;
                Game.rightWalkspeed = 5;
            }
            function onTouchEndRUN(e:TouchEvent):void
            {
                Game.upWalkspeed = -3;
                Game.downWalkspeed = 3;
                Game.leftWalkspeed = -3;
                Game.rightWalkspeed = 3;
            }

            for each (var aButton:MovieClip in main.Buttons)
            {
                aButton.addEventListener(TouchEvent.TOUCH_BEGIN, onDown);
                aButton.addEventListener(TouchEvent.TOUCH_OUT, onUp);
                aButton.addEventListener(TouchEvent.TOUCH_END, onUp);
            }

            function onDown(e:TouchEvent):void
            {
                switch (e.currentTarget)
                {
                    case main.up_dpad :
                        Game.goingUp = true;
                        Game.goingDown = false;
                        Game.goingLeft = false;
                        Game.goingRight = false;
                        main._Direction.x = 0;
                        main._Direction.y = Game.upWalkspeed;


                        if (Game.player1)
                        {
                            if (P1UAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P1UAnim_mc:MovieClip = new mc_P1UAnim();
                                addChild(P1UAnim_mc);
                            }
                        }
                        else if (Game.player2)
                        {
                            if (P2UAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P2UAnim_mc:MovieClip = new mc_P2UAnim();
                                addChild(P2UAnim_mc);
                            }
                        }
                        break;

                    case main.down_dpad :
                        Game.goingUp = false;
                        Game.goingDown = true;
                        Game.goingLeft = false;
                        Game.goingRight = false;
                        main._Direction.x = 0;
                        main._Direction.y = Game.downWalkspeed;


                        if (Game.player1)
                        {
                            if (P1DAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P1DAnim_mc:MovieClip = new mc_P1DAnim();
                                addChild(P1DAnim_mc);
                            }
                        }
                        else if (Game.player2)
                        {
                            if (P2DAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P2DAnim_mc:MovieClip = new mc_P2DAnim();
                                addChild(P2DAnim_mc);
                            }
                        }
                        break;

                    case main.left_dpad :
                        Game.goingUp = false;
                        Game.goingDown = false;
                        Game.goingLeft = true;
                        Game.goingRight = false;
                        main._Direction.x = Game.leftWalkspeed;
                        main._Direction.y = 0;


                        if (Game.player1)
                        {
                            if (P1LAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P1LAnim_mc:MovieClip = new mc_P1LAnim();
                                addChild(P1LAnim_mc);
                            }
                        }
                        else if (Game.player2)
                        {
                            if (P2LAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P2LAnim_mc:MovieClip = new mc_P2LAnim();
                                addChild(P2LAnim_mc);
                            }
                        }
                        break;

                    case main.right_dpad :
                        Game.goingUp = false;
                        Game.goingDown = false;
                        Game.goingLeft = false;
                        Game.goingRight = true;
                        main._Direction.x = Game.rightWalkspeed;
                        main._Direction.y = 0;


                        if (Game.player1)
                        {
                            if (P1RAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P1RAnim_mc:MovieClip = new mc_P1RAnim();
                                addChild(P1RAnim_mc);
                            }
                        }
                        else if (Game.player2)
                        {
                            if (P2RAnim_mc != null)
                            {
                            }
                            else
                            {
                                var P2RAnim_mc:MovieClip = new mc_P2RAnim();
                                addChild(P2RAnim_mc);
                            }
                        }
                        break;
                }
                if (! Game.inMotion)
                {
                    Game.inMotion = true;
                    addEventListener(Event.ENTER_FRAME, onFrame);
                }
            }

            function onFrame(e:Event)
            {
                movePlayer(main._Direction.x, main._Direction.y);
            }

            function onUp(e:TouchEvent):void
            {
                removeEventListener(Event.ENTER_FRAME, onFrame);

                Game.goingUp = false;
                Game.goingDown = false;
                Game.goingLeft = false;
                Game.goingRight = false;

                Game.inMotion = false;
                main._Direction.x = 0;
                main._Direction.y = 0;
            }

            function movePlayer(movementX:Number, movementY:Number):void
            {
                var originalX:Number = Game.playerPosKeeper_mc.x;
                var originalY:Number = Game.playerPosKeeper_mc.y;
                Game.playerPosKeeper_mc.x +=  movementX;
                if (checkCollision())
                {
                    Game.playerPosKeeper_mc.x = originalX;
                }
                Game.playerPosKeeper_mc.y +=  movementY;
                if (checkCollision())
                {
                    Game.playerPosKeeper_mc.y = originalY;
                }
            }

            function checkCollision():Boolean
            {
                for each (var StageCollisions:MovieClip in main.StageCollisions)
                {
                    if (Game.playerPosKeeper_mc.hitTestObject(StageCollisions))
                    {
                        return true;
                        Game.inMotion = false;
                    }
                }
                return false;
            }
        }
    }
}
编辑:

我是这样做的:

有一个电影剪辑绑定到玩家的坐标上。这是动画设置其x和y坐标的位置。 如果玩家开始移动,则inMotion变量变为true,这意味着玩家正在移动。 玩家前进方向的一个变量也会改变(如果他向左移动goingLeft=true)

如果玩家击中某个东西,或在DPAD上放弃某个方向,则inMotion为false

这样可以在适当的时间将动画添加到舞台,并在适当的时间设置动画。 例如:

我按左DPAD

inMotion=true,goingLeft=true

如果左侧动画不在舞台上,请将其添加到舞台

左侧动画检测变量并相应地响应它们: inMotion和goingLeft 向左移动 !动态&!戈因格夫特 当时是闲置的,不要动画片 动态&!戈因格夫特 如果正在向另一个方向移动,请删除动画

我按右DPAD 遵循上述相同的周期

这可以确保在正确的时间播放正确的动画,并且此代码可能比
它必须是,但这确实显示了我在代码中所知道的限制。

只要看到两个看起来相似的代码块,就知道代码是坏的:。“代码越少越好”的公式总是正确的

空代码块会降低可读性:

// Bad.
if (condition)
{
}
else
{
    // some code
}

// Good.
if (!condition)
{
    // some code
}
如果使用逻辑&&和逻辑|将多个条件堆叠到一个中,除非它变得不可读:

// Bad.
if (conditiona)
{
    if (conditionb)
    {
        if (conditionc)
        {
        }
        else
        {
            // some code
        }
    }
}

// Better.
if (conditiona && conditionb && !conditionc)
{
    // some code
}
如果您的目标是分配单个变量,而不是大量的Ifs,则可以使用ternar运算符。同样,除非可读性下降:

var foo:*;

// Block of ifs.
if (conditiona)
{
    foo = 1;
}
else if (conditionb)
{
    foo = 2;
}

// Ternar assignment.
var foo:* = conditiona? 1: conditionb? 2: foo;

// Ternar assignment in a more readable form.
var foo:* = conditiona? 1: (conditionb? 2: foo);
因此,您的代码应用了上述所有内容:

        function setDirection(tox:Number, toy:Number):void
        {
            Game.goingUp    = (toy < 0);
            Game.goingDown  = (toy > 0);
            Game.goingLeft  = (tox < 0);
            Game.goingRight = (tox > 0);

            main._Direction.y = Game.goingUp  ? Game.upWalkspeed  : Game.goingDown ? Game.downWalkspeed : 0;
            main._Direction.x = Game.goingLeft? Game.leftWalkspeed: Game.goingRight? Game.rightWalkspeed: 0;
        }

        function onDown(e:TouchEvent):void
        {
            if (Game.player1 && !P1UAnim_mc)
            {
                var P1UAnim_mc:MovieClip = new mc_P1UAnim();
                addChild(P1UAnim_mc);
            }

            if (Game.player2 && !P2UAnim_mc)
            {
                var P2UAnim_mc:MovieClip = new mc_P2UAnim();
                addChild(P2UAnim_mc);
            }

            switch (e.currentTarget)
            {
                case main.up_dpad :
                    setDirection(0,-1);
                    break;

                case main.down_dpad :
                    setDirection(0,1);
                    break;

                case main.left_dpad :
                    setDirection(-1,0);
                    break;

                case main.right_dpad :
                    setDirection(1,0);
                    break;
            }

            if (!Game.inMotion)
            {
                Game.inMotion = true;
                addEventListener(Event.ENTER_FRAME, onFrame);
            }
        }

一旦您看到两个看起来相似的代码块,就知道代码是错误的:。“代码越少越好”的公式总是正确的

空代码块会降低可读性:

// Bad.
if (condition)
{
}
else
{
    // some code
}

// Good.
if (!condition)
{
    // some code
}
如果使用逻辑&&和逻辑|将多个条件堆叠到一个中,除非它变得不可读:

// Bad.
if (conditiona)
{
    if (conditionb)
    {
        if (conditionc)
        {
        }
        else
        {
            // some code
        }
    }
}

// Better.
if (conditiona && conditionb && !conditionc)
{
    // some code
}
如果您的目标是分配单个变量,而不是大量的Ifs,则可以使用ternar运算符。同样,除非可读性下降:

var foo:*;

// Block of ifs.
if (conditiona)
{
    foo = 1;
}
else if (conditionb)
{
    foo = 2;
}

// Ternar assignment.
var foo:* = conditiona? 1: conditionb? 2: foo;

// Ternar assignment in a more readable form.
var foo:* = conditiona? 1: (conditionb? 2: foo);
因此,您的代码应用了上述所有内容:

        function setDirection(tox:Number, toy:Number):void
        {
            Game.goingUp    = (toy < 0);
            Game.goingDown  = (toy > 0);
            Game.goingLeft  = (tox < 0);
            Game.goingRight = (tox > 0);

            main._Direction.y = Game.goingUp  ? Game.upWalkspeed  : Game.goingDown ? Game.downWalkspeed : 0;
            main._Direction.x = Game.goingLeft? Game.leftWalkspeed: Game.goingRight? Game.rightWalkspeed: 0;
        }

        function onDown(e:TouchEvent):void
        {
            if (Game.player1 && !P1UAnim_mc)
            {
                var P1UAnim_mc:MovieClip = new mc_P1UAnim();
                addChild(P1UAnim_mc);
            }

            if (Game.player2 && !P2UAnim_mc)
            {
                var P2UAnim_mc:MovieClip = new mc_P2UAnim();
                addChild(P2UAnim_mc);
            }

            switch (e.currentTarget)
            {
                case main.up_dpad :
                    setDirection(0,-1);
                    break;

                case main.down_dpad :
                    setDirection(0,1);
                    break;

                case main.left_dpad :
                    setDirection(-1,0);
                    break;

                case main.right_dpad :
                    setDirection(1,0);
                    break;
            }

            if (!Game.inMotion)
            {
                Game.inMotion = true;
                addEventListener(Event.ENTER_FRAME, onFrame);
            }
        }

上次我建议您开始以算法的方式处理代码:。请考虑这样做,你的代码中满是不必要的重复块,发现其中的问题本身就是一个问题,更不用说解决问题了。嗨,我不知道用算法的方式编写代码意味着什么。谷歌>算法思维。多读书,多学习。为什么?因为如果你不这样做,你将淹没在自己代码的海洋中。我已经在另一个线程中解释了你的代码有什么问题,继续按你的方式去做会让你一事无成。正如你所见,没有人敢在这里分析你的问题,原因(可能是唯一的原因)是你的代码是它实际需要的3-4倍,因此很难理解。我用一些可能有用的信息更新了这篇文章,因为我不想在我的声明中乱加评论。1。您仍然有4段完全相同的代码,每个开关块都有一段。2.用脚本而不是设计来创建UI布局有什么意义吗?上次我建议您开始用算法的方式来处理代码:。请考虑这样做,你的代码中满是不必要的重复块,发现其中的问题本身就是一个问题,更不用说解决问题了。嗨,我不知道用算法的方式编写代码意味着什么。谷歌>算法思维。多读书,多学习。为什么?因为如果你不这样做,你将淹没在自己代码的海洋中。我已经在另一个线程中解释了你的代码有什么问题,继续按你的方式去做会让你一事无成。正如你所见,没有人敢在这里分析你的问题,原因(可能是唯一的原因)是你的代码是它实际需要的3-4倍,因此很难理解。我用一些可能有用的信息更新了这篇文章,因为我不想在我的声明中乱加评论。1。您仍然有4段完全相同的代码,每个开关块都有一段。2.使用脚本而不是设计来创建UI布局有意义吗?Game.goingUp=(toy<0);如果玩具值大于0,那么这个值会变成什么?这是在使用逻辑吗?更具体地说,关于逻辑的东西,如果它越大,它本质上忽略了玩具的价值吗?我假设如果Game.goingUp比toy小,那么Game.goingUp将等于toy。另外,我注意到您将if语句放在了开关之外。这基本上破坏了动画,因为P1UAnim_mc始终是使用中的动画,这就是为什么我将这些语句放在开关up/down/left/right中,因为这是检查动画是否等于null的唯一适当时间,就像它到达开关中的那个点一样,这意味着应该播放相应的动画。这就是我无法更改它并使代码更高效的原因。我正在考虑使用Ternar赋值,因为它可能是我正在寻找的修复方法。Game.goingUp=(toy<0);表示“如果玩具<0,则goingUp=t