Flash CS6 AS3:为什么碰撞是传送而不是阻塞

时间:2014-04-25 03:41:52

标签: actionscript-3 collision-detection flash-cs6 side-scroller

所以我不确定如何说出这个问题 - 如果有人有更好的想法,请随意:)

但基本上,我的sidescroller碰撞表现得很奇怪。我有一个边界'开始位置左侧的框(_boundaries),以防止字符在开始时向左移动。以前,它工作正常(但其他事情都破了)。在解决了许多其他碰撞问题(IE落在地板上,陷入地板,重力表现奇怪)之后,左碰撞大部分时间都停止了工作。

如果你从5-10像素进入墙壁,你将会,而不是被阻挡/阻止移动,你会传送'到了墙的顶部并继续前进。如果您的距离小于5-10像素,并开始移动,则会被阻止。我已经提供了一个图像(通过链接)到布局是什么。

但是如何修复我的sidescroller代码,以便墙总是阻塞(没有一个可笑的巨大碰撞盒/区域)。或者,是否有更好的方法来处理我的所有碰撞?

http://i.imgur.com/orvErfQ.png

碰撞代码:

private function processCollisions():void
    {

            //Respawn if fell off stage
            if(_player.y > stage.stageHeight)
            {
                _player.x = _startMarker.x;
                _player.y = _startMarker.y;
                _boundaries.x = 0;
                _boundaries.y = 0;
                _vy = 0;
            }

            //Otherwise process collisions with boundaries
            else
            {   

            var testX = _player.x
            var testY = _player.y - (_player.height / 2);
            var vCollision:Boolean = false;

                if(moveLeft){                   
                    testX -= horizMove;                     
                    if(_boundaries.hitTestPoint((testX - _player.width / 2), _player.y-5, true))
                    {
                        moveLeft = false;
                        trace("PING");
                    }
                }

                if(moveRight){                  
                    testX += horizMove;     
                    if(_boundaries.hitTestPoint((testX + _player.width / 2), _player.y-5, true))
                    {
                        moveRight = false;
                        trace("PONG");
                    }
                }

                if(jump){                   
                    testY += vertMove;                      
                    if(_boundaries.hitTestPoint(_player.x, (testY - _player.height / 2), true))
                    {
                        jump = false;
                        trace("PANG");
                    }
                }

                //if(_vy > 0){
                    testY += _vy;
                    if(_boundaries.hitTestPoint(_player.x, (testY + _player.height / 2), true))
                    {
                        vCollision = true;
                    }

                    if(vCollision)
                    {
                        while(vCollision)
                        {
                            _player.y -= 0.1;
                            vCollision = false;

                            if(_boundaries.hitTestPoint(_player.x, _player.y, true))
                            {
                                vCollision = true;
                            }
                        }
                        _vy = 0;
                    }

             }
         movement();
    }

运动代码:

private function movement():void
    {
        if(moveLeft)
        {               
            _vx = -5;                                   

            faceLeft = true;
            faceRight = false;                          
        }
        else if(moveRight)
        {
             _vx = 5;                                   

            faceLeft = false;
            faceRight = true;       
        }

        else if(jump)
        {
            //_player.y += vertMove;    
            _vy = -15;
        }
    }

使用它的地方:

private function enterFrameHandler(e:Event):void
    {
        //Upon entering a frame;
        //Gravitate Player
        _vy += 1.75;

        //Move Player
        _player.x += _vx;
        _player.y += _vy;

        //Process Collisions for Player
        processCollisions();

        //Scroll map
        scrollStage();
    }

0 个答案:

没有答案