动作脚本3.平台游戏物理故障(重力)

时间:2014-04-23 22:13:09

标签: actionscript-3 flash game-physics

当我的球员触地时,他无法移动,因为他在场上并且在增加。

在主要课程中我有动作

    private function processMovement():void
    {
        if (touchingGround)
        {   
            if (upKey)
            {
                character.jumpUp();
            }   

            if (leftKey)
            {
                character.moveLeft();
            }

            if (rightKey)
            {
                character.moveRight();
            }

            if (!leftKey && !rightKey && !upKey)
            {
                character.dontMove();
            }

        }
    }

然后在角色类中你会看到这个。

public class player extends OnGround 
{
    public var canJumpAn:Boolean;
    public var attackAn:Boolean;
    public  var jumpheight:Number = 18;

    public function player() 
    {
        addEventListener(Event.ADDED_TO_STAGE, onAdd);

    }

    private function onAdd(e: Event): void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAdd);
    }

    public function moveLeft():void 
    {
        //decrease VELOCITY
        xV -= 2;
        if (xV > -7)
        {
            xV = -7;
        }           
        this.gotoAndStop("run");

        //add this to the Mc . x pos baby. 
        this.x += xV;

        this.scaleX = -1;
        charIsrunning = true;
    }


    public function moveRight():void 
    {
        //increase VELOCITY
        xV += 2;
        if (xV > 7)
        {
            xV = 7;
        }
        this.gotoAndStop("run");

        //add this to the Mc . x pos baby. 
        this.x += xV;
        this.scaleX = 1;
        charIsrunning = true;
    }



    public function dontMove():void 
    {
        //if no button presses then do this 
        this.gotoAndStop("stop");

        //slowd down ball 
        xV *= friction;
        charIsrunning = false;
        isDefending = false;

        //stop the ball if you're not moving 
        if (xV > - 1 && xV < 1)
        {
            xV = 0;
        }
    }

    override public function positionOnLand():void
    {
        isJumping = false;
        ///=gotoAndStop(1);

    }

    public function defend():void 
    {
        isDefending = true;
        this.gotoAndStop("defend");
        charIsrunning = false;
    }

    public function attack():void 
    {
        this.gotoAndStop("attack");
    }

    public function jumpUp():void 
    {

        if (!isJumping)
        {
            isJumping = true;
            this.gotoAndStop("jump");
            //
        }

    }




}

}

正如您所见,OnGround是玩家扩展的另一个类。

public class OnGround extends MovieClip
{
    public var grav:Number;
    public var friction:Number;
    public var xV:Number;
    public var yV:Number;

    protected var charIsrunning:Boolean;
    protected var isDefending:Boolean;
    protected var isJumping:Boolean;

    public function OnGround() 
    {
        addEventListener(Event.ADDED_TO_STAGE, init)
        charIsrunning = false;
        isDefending = false;
        //gotoAndStsop("jump");
    }

    private function init(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        //gravity
        grav = 0.6;

        //y velocity 
        yV = 0;

        //x velocity 
        xV = 0;

        //
        friction = 0.9;
        addEventListener(Event.ENTER_FRAME, fall);

    }

    private function fall(e:Event):void 
    {
        //add grav to y VELOCITY 
        yV += grav;
        trace(yV);


        this.y += yV

    }

    public function incrementUp():void 
    {
        this.y -= 0.1;
        //trace("incrementing");
    }

    public function keepOnGround():void 
    {
        //trace("onGroundBitch");
        grav = 0;   
        yV = 0;
        positionOnLand();
    }

    public function positionOnLand():void 
    {
        //overide
    }

}

}

这是一个在主类

中的函数
        for (var c:int = 0; c < childrenOnStage; c++)
        {

            if (getChildAt(c).name == "player")
            {
                if (ground.level1Ground.hitTestPoint(getChildAt(c).x + 13, getChildAt(c).y, true) || ground.level1Ground.hitTestPoint(getChildAt(c).x - 13, getChildAt(c).y, true))
                {
                    getChildAt(c).y --;

                    //OnGround(getChildAt(c)).incrementUp();
                    OnGround(getChildAt(c)).keepOnGround();

                    touchingGround = true;

                }
                else
                {
                    touchingGround = false;
                }

问题在于当玩家接触地面时,它的y位置会增加,直到它不接触地面,然后通过将grav变为= 0且y速度变为0来假设它保持在地面上。 / p>

这意味着重力关闭,玩家y位置不会向上移动(当我跳跃时) 或者当他们继续留在地上时。

如果有人可以帮助我或指出我正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不确定你为什么每个对象都有一个重力值,除非你真的打算让不同的对象实例有个别的重力。
如果不是,我会引用重力常数。

反重力是游戏的一个特征吗?如果没有,那么我将避免将重力设置为0.它可以“工作”。 (在某种程度上)但它不是现实的良好模型/抽象。

相反,我要做的是分离所施加的力量和当前的动量:
始终施加(向下)重力 当你站在地面上时,施加与重力相等且相反的向上力。 当你跳跃时,添加一个向上力量的一次性实例。

使用当前力来改变当前动量并使用当前动量来改变位置。