当击中地面时,角色正在弹跳。它不会保持稳定

时间:2014-02-07 23:39:19

标签: actionscript-3 platform hittest

问题很清楚。角色在舞台上稳定,背景和地面都在移动。但是当角色撞到地面时,它会一次又一次地反弹。这是代码。我怎么解决呢?当我移动角色时它的工作完美,但当移动物体被地面反弹时,就会出现弹跳问题。 问题在于:http://www.swfcabin.com/open/1391814250

public function controller():void
    {
        if (rightKey || leftKey || jumpKey)
        {
            if (rightKey)
            {
                if (jumpWalk || canJump)
                {   
                    hero.gotoAndStop(2);
                    hero.scaleX = 1;
                    xSpeed -=  speed;
                }
            }
            if (leftKey)
            {
                if (jumpWalk || canJump)
                {   
                    hero.gotoAndStop(2);
                    hero.scaleX = -1;
                    xSpeed +=  speed;
                }
            }

            if (jumpKey && canJump)
            {   
                ySpeed +=  15;
                canJump = false;
            }

        }
        else
        {
            hero.gotoAndStop(1);
        }
        if(!canJump){
            hero.gotoAndStop(3);
        }

         ySpeed -= gravity;

        if(ySpeed >10){
            ySpeed = 10;
        }
        else if(ySpeed < -10){
            ySpeed = -10;
        }
        if(xSpeed>10){
            xSpeed = 10
        }
        else if(xSpeed < -10){
            xSpeed = -10;
        }
        xSpeed *= 0.8;

        level.x += xSpeed;
        level.y += ySpeed;

    }// controller function


public function loop(event:Event):void
    {
        controller();
        while(level.hitTestPoint(hero.x , hero.y + hero.height/2 -1 - ySpeed , true)){
            trace(ySpeed +"dasd");
            ySpeed ++;
            canJump = true;

        } }

1 个答案:

答案 0 :(得分:1)

现在正在发生的事情:当你陷入地形时,你正在增加ySpeed - 向上的动量 - 直到一个'tick'将角色拉出地面。但随后人物向上飞,因为你增加了他们的上升势头。他们仍然具有上升势头,直到重力将他们拉回来,所以他们将继续“弹跳”。要解决此问题,请执行以下操作:

而不是主循环中的ySpeed ++;,尝试level.y++;这意味着当他被嵌入时(或实际上拉下地形,因为你的角色是静止的),将英雄从地形中拉出来,而不是改变他的势头让他出局。

您还应该在其中添加ySpeed = 0;。当你到达地面时,这将代表你失去所有的y动力。

所以你的主循环看起来像这样:

public function loop(event:Event):void
    {
        controller();
        while(level.hitTestPoint(hero.x , hero.y + hero.height/2 -1 - ySpeed , true)){
            trace(ySpeed +"dasd");
            level.y++;
            ySpeed = 0;
            canJump = true;
        } }