平台故障AS3

时间:2014-05-26 04:16:51

标签: actionscript-3 flash

我正在制作以口袋妖怪为主题的游戏,其中将包含各种迷你游戏。第一个场景要求角色在两个平台上跳跃,一个在右边,另一个在左边,以便到达一个Pokeball,触发一个迷你游戏。

角色正确跳跃并毫无问题地降落在平台上;但是,每当我尝试直接跳到平台下面时,角色就会卡住。他可以移动,但他的头部被卡在了底部(想象他沿着侧面滑动)。奇怪的是,一旦他的头部不再位于所述平台下方,他就会进行跳跃运动。我还发现,反复按下跳跃键会强迫角色进出平台。

附件是我到目前为止的代码:

    var gravity:Number = 10;  
    var jumpPower:Number = 0;  
    var isJumping:Boolean = false; 
    var checkCollision:Boolean = false;
    var checkJump:Boolean = false;
    var ground:Number = 393 - trainer.height;
    var isRight = false;
    var checkUnder:Boolean = false;
    var isLeft = false;

    stage.addEventListener(KeyboardEvent.KEY_UP,released);
    stage.addEventListener(KeyboardEvent.KEY_DOWN,pressed);
    stage.addEventListener(Event.ENTER_FRAME,loop);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, doJump);  
    stage.addEventListener(Event.ENTER_FRAME, update);
    stage.addEventListener(Event.ENTER_FRAME, ballHit);

    //MOVING LEFT OR RIGHT CODE-----------------------------------------------------------
    function released(event:KeyboardEvent){
        if(event.keyCode == Keyboard.RIGHT){
            isRight = false;
            }
        if(event.keyCode == Keyboard.LEFT){
            isLeft = false;
            }
        }

    function pressed(event:KeyboardEvent){
        if(event.keyCode == Keyboard.RIGHT){
            isRight = true;
            }
        if(event.keyCode == Keyboard.LEFT){
            isLeft = true;
            }
        }

    function loop(e:Event){
        if(isRight){
            trainer.x += 10;
            }
        if(isLeft){
            trainer.x -= 10;
            }
        //trainer hits walls
        if(trainer.x >= 500){
            trainer.x = 500;
            }
        if(trainer.x <=0){
            trainer.x = 0;
            }
        if(trainer.y <= 0){
            trainer.y = 0;
            }
        }
    // END OF MOVING LEFT OR RIGHT CODE-----------------------------------------------------------

    //JUMP WITH GRAVITY CODE----------------------------------------------------------------------
    function doJump(event:KeyboardEvent):void  
    {  

       if(isJumping == false){
       if(event.keyCode == Keyboard.UP)  
        {  
            jumpPower = -35;
    isJumping = true;
}          
}  
    }  

    function update(evt:Event):void  
    {  
        if(isJumping == true)  
        {  
            trainer.y += jumpPower;  
            jumpPower += 5;  }
        if(trainer.y >= 300)
        {    
            isJumping = false; 
        }
        //character lands on platform
        else if(trainer.y + 65 >= platformOne.y && trainer.x >=  platformOne.x - 60 && trainer.hitTestObject(platformOne)){
            isJumping = false;
        }
        else if(trainer.y + 65 >= platformTwo.y && trainer.x <=  platformTwo.x + 250 && trainer.hitTestObject(platformTwo)){
            isJumping = false;
            }

        else{
            isJumping = true;
            }
        /*if(trainer.y > platformOne.y && trainer.x >  platformOne.x && trainer.hitTestObject(platformOne)){
            trace("test");
            }*/
    }  
    //END OF JUMP WITH GRAVITY CODE--------------------------------------------------------------

    //CHECK BALL HIT CODE------------------------------------------------------------------------
    function ballHit(checkCol:Event):void{
     if(trainer.hitTestObject(pokeballOne)){
         pokeballOne.visible = false;
         checkCollision = true;
         }
        if(checkCollision == true){
            pokeBallOpenOne.y = 33.3;
            pokeBallOpenOne.x = 30.9;
            btnChallenge1.y = 58.3;
            btnChallenge1.x = 8.9;
            }
    }
    //END OF CHECK BALL HIT CODE----------------------------------------------------------------

    //CLICKING THE CHALLENGE BUTTON-------------------------------------------------------------
    btnChallenge1.addEventListener(MouseEvent.CLICK,handleClick3);

    function handleClick3(pEvent:MouseEvent){
        stage.removeEventListener(Event.ENTER_FRAME, update);
        stage.removeEventListener(Event.ENTER_FRAME, ballHit);
        stage.removeEventListener(Event.ENTER_FRAME,loop);
        gotoAndPlay("shootingStart", "Scene 4" );
    }
    //END OF CLICK THE CHALLEGNE BUTTON---------------------------------------------------------

所以,我想修复的问题是:

  1. 如何防止角色卡在平台上?

  2. 如何防止角色不再在平台下进行跳跃动作?

  3. 非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,您isJumpingjumpPower同时负责两件事:

isJumping控制玩家是否可以跳过是否应用了玩家的跳跃动作。 jumpPower控制玩家的跳跃动作让它们像重力一样落下。

可能有一种聪明的方法可以让所有这一切发挥作用,但我个人觉得更容易分开gravityisJumpingjumpPower变量。

看起来您已经在顶部有一个gravity变量,但它似乎没有在其他任何地方使用,所以我建议:

  • 为每次更新添加到其位置的玩家使用“速度”变量。
  • 如果gravity为真,则每次更新都会将isJumping添加到玩家的y速度。
  • isJumping签入update换成if (jumpPower < 0),或者只是在按下键盘时立即将跳跃力添加到玩家的y速度。
  • 在平台碰撞中检查玩家的y速度,然后如果他们向下移动设置isJumping为假,但是如果他们向上移动设置为jumpPower并且他们的y速度为{{1 }}。