AS3碰撞检测或键盘控制改变我的播放器MovieClip路径

时间:2014-01-31 10:51:14

标签: actionscript-3 flash keyboard collision-detection movieclip

我制作了一个类似迷宫的游戏,玩家通过箭头或WASD控制舞台周围的动画片段(_character)并在一定时间内收集东西。 MovieClip有五个不同的帧,每个帧都有自己的状态动画,左,右,上,下和静止。

在舞台上有正方形/方框,有碰撞检测,我需要能够在不同的方向上绕它们进行操纵。

我的问题是,我似乎无法在动画片段中获得动画,同时动画片段本身正常运动。

我当前的控件可以很好地锁定障碍物,当没有按下按键时停止并播放相关的_字符动画,但是当按下两个对角线方向键时,即使我释放其中一个键,MovieClip也会沿对角线移动。

例如,如果舞台上有一个方格/盒子,我想顺时针绕它移动(从顶部开始)我应该能够向右,向下,向左,向上,然后向右按压返回到我原来的位置。

然而,使用我当前的代码,我会向右按,向下按(然后我可以按下左边的框),我的Movieclip将移动到舞台的右下角(向下+向右)。

即使我把手指从DOWN键上移开然后按下它也不会自己纠正并向右移动,它会卡在对角线位置!

图像给出了按下LEFT的示例,然后在游戏开始时按下DOWN。

Game Movement http://i61.tinypic.com/1szl7o.jpg

当我从舞台上移除所有框以测试空白区域中的移动时,如果我按下两个按钮,没有框可以移动它只是前往角落,动画片段对象仍然会固定为对角线方向它所针对的阶段。

防止这是我的问题,我不能禁用多次按键,因为在迷宫中移动变得太困难了(_字符必须完全排列到间隙)

当前代码:

方向变量

private var _bUp:Boolean = false;
private var _bDown:Boolean = false;
private var _bLeft:Boolean = false;
private var _bRight:Boolean = false;

KeyDown Handler中的变量为true。

private function keyDownHandler(event:KeyboardEvent):void
        {


            if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
            {
                _bLeft=true;

            }
            else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
            {
                _bRight=true;

            }
            else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
            {
                _bUp=true;

            }
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
            {
                _bDown=true;

            }

KeyUp中的错误。

private function keyUpHandler(event:KeyboardEvent):void
    {
                    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT 
                    || event.keyCode == 65 || event.keyCode == 68)
            {
                    _bLeft=false;
                    _bRight=false;

            } 
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP 
                    || event.keyCode == 87 || event.keyCode == 83 )
            {
                _bUp=false;
                _bDown=false;

            }

在enterFrameHandler _character中移动速度并播放动画。如果没有按下任何键,则速度为0且_字符仍然是。然后角色movieclip获取要移动的速度值,我们检查阶段边界,然后与框子碰撞。

private function enterFrameHandler(event:Event):void
        {   

                            var _updown:Boolean=Boolean(!(_bUp==_bDown)); 
                            var _leftright:Boolean=Boolean(!(_bLeft==_bRight));

                        if (!_updown && !_leftright) 
                        {
                            // not moving anywhere
                            _character.gotoAndStop(1);
                            _character.vy=0;
                            _character.vx=0; 

                        } 
                        else
                        {
                            if (_bUp) 
                            {
                                _character.vy=-4;
                                _character.gotoAndStop(2);
                            } 
                            else if (_bDown)
                            {
                                _character.vy=4;
                                _character.gotoAndStop(3);
                            } 

                            if (_bLeft)
                            {
                                _character.vx=-4;
                                _character.gotoAndStop(4);
                            } 
                            else if (_bRight)
                            {
                                _character.vx=4;
                                _character.gotoAndStop(5);
                            } 
                        }

                    _character.x += _character.vx; 
                    _character.y += _character.vy;
                    checkStageBoundaries(_character);
                    //Collisions
                    Collision.block(_character,_box1);
                        Collision.block(_character,_box2);

与盒子碰撞。^^^

旁注

不确定它的重要性,但我的旧键盘方法只使用enterFrame Handler将速度链接到角色对象,而KeyDown Handler移动了chacters速度。这使用了相同的碰撞检测盒,但我没有移动movieclip对象的问题

该代码是:

private function keyDownHandler(event:KeyboardEvent):void
            {
                if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
                {
                    _character.vx = -4;
                    _character.gotoAndStop(4);
                }
                else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
                {
                    _character.vx = 4;
                    _character.gotoAndStop(5);
                }
                else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
                {
                    _character.vy = -4;
                    _character.gotoAndStop(2);
                }
                else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
                {
                    _character.vy = 4;
                    _character.gotoAndStop(3);
                }   
            }

// Key up handler stops velocity and plays first frame which is the stationary image.

private function keyUpHandler(event:KeyboardEvent):void
            {
                if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT 
                    || event.keyCode == 65 || event.keyCode == 68)
                {
                    _character.vx = 0;
                    _character.gotoAndStop(1);
                } 
                else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP 
                    || event.keyCode == 87 || event.keyCode == 83 )
                {
                    _character.vy = 0;
                    _character.gotoAndStop(1);
                }
            }  

这种移动技术完美地将MovieClip移动到舞台周围,没有奇怪的路线,动画无法通过多次按键正常播放,所以我切换到布尔变量和enterFrame控件。

结论

我不知道碰撞检测或键盘控制是否应该受到责备,但我希望能够快速操纵播放器Movieclip,并让各种状态动画播放。

我之前看到过基于磁贴的设计,但我可以在上面的两个不同的键盘尝试中得到我想要的东西。当然,我可以在不重新设计整个瓷砖的情况下获得两全其美的效果?!请帮帮我!

1 个答案:

答案 0 :(得分:1)

知道了。我没有告诉你在解析当前运动之前应该清除_character的速度。抱歉。所以,你添加这个:

_character.vx=0;
_character.vy=0;

在开始时进入函数enterFrameHandler,这应该使你的char正常运行。