首页 文章

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

提问于
浏览
0

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

在舞台上有正方形/盒子与碰撞检测,我需要能够在所有不同的方向周围操纵它们 .

我的问题是,我似乎无法在动画片段 AND 内正确移动动画片段本身同时工作 .

我当前的控件可以在障碍物周围拉链,在没有按键时停止并播放相关的_字符动画,但是当按下两个对角线方向键时,即使我释放其中一个键,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);

与盒子碰撞 . ^^^

On a side note

不确定它的重要性,但我的旧键盘方法只使用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控件 .

In Conclusion

我不知道碰撞检测或键盘控制是否应该受到责备,但我只是想能够 manoeuvre the player Movieclip quickly around the boxes and have the appropriate state animations play.

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

1 回答

  • 1

    得到它了 . 我没有告诉你在解析当前运动之前应该清除_1522357的速度 . 抱歉 . 所以,你添加这个:

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

    进入函数 enterFrameHandler 的开头,这应该让你的char去正确的方式 .

相关问题