0

对于每个角色皮肤,它有 4 个 MovieClip 对应于每个可能的方向(上、下、左和右)。

例子:

对于我的 Player 1 皮肤,它会是这样的。

播放器 1 向上动画 (P1UAnim_mc)

播放器 1 向下动画 (P1DAnim_mc)

玩家 1 左动画 (P1LAnim_mc)

播放器 1 右动画 (P1RAnim_mc)

现在,我的移动工作方式是我们有一个与动画大小相匹配的影片剪辑(它们的大小不会改变),并且这个影片剪辑是不可见的,这就是我们告诉它时移动的内容(我称之为球员位置守门员)。这是通过单击 DPAD 上的一个方向来完成的,然后我们将玩家移动到适当的方向,并使用该方向对应的步行速度,然后我们检查是否在我的障碍物阵列中撞到了什么东西。如果我们这样做了,我们会将玩家移回。

所以现在我们已经解决了这个问题,我需要有与玩家使用/进入的方向和角色皮肤相对应的动画。

我有一个想法,每次我们进入一个帧时都有一个事件监听器,我们检查玩家正在使用什么 charSkin,然后检查方向,然后添加适当的动画。我们不需要更新动画 x,y 坐标,因为在它们的类文件中,它总是将自身更新为玩家位置保持器的坐标的 x 和 y,并且知道何时移除自身。所以我需要做的就是找到合适的时间来添加它,其余的留给动画的类。

我尝试过的这种技术的问题是代码真的很难理解,这是一连串的 if else 语句检查上述因素。

这是我的 MovementReworked 课程,其中不包含动画,所以你们可以实际阅读它。如果您希望我编辑帖子并添加带有草率动画代码的运动类,我会的,但它非常难以阅读。

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 MovementReworked extends MovieClip
    {
        public function MovementReworked(main:Game)
        {
            // I will be changing these addChilds in the future
            // Just ignore it for now

            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

            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;
            // I will be changing these addChilds in the future

            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.dir = 1;
                        Game._Direction.x = 0;
                        Game._Direction.y = Game.upWalkspeed;
                        break;
                    case main.down_dpad :
                        Game.dir = 2;
                        Game._Direction.x = 0;
                        Game._Direction.y = Game.downWalkspeed;
                        break;
                    case main.left_dpad :
                        Game.dir = 3;
                        Game._Direction.x = Game.leftWalkspeed;
                        Game._Direction.y = 0;
                        break;
                    case main.right_dpad :
                        Game.dir = 4;
                        Game._Direction.x = Game.rightWalkspeed;
                        Game._Direction.y = 0;
                        break;
                }
                if (Game.idle)
                {
                    Game.idle = false;
                    addEventListener(Event.ENTER_FRAME, onFrame);
                }
            }
            function onFrame(e:Event):void
            {
                movePlayer(Game._Direction.x, Game._Direction.y);
            }

            function onUp(e:TouchEvent):void
            {
                Game.idle = true;
                removeEventListener(Event.ENTER_FRAME, onFrame);
            }

            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.idle = true;
                    }
                }
                return false;
            }
        }
    }
}
4

0 回答 0