2013-05-31 26 views
0

我想创建一个平台游戏,我有跑步,跳跃和双跳工作。现在我的问题是我想让玩家按跳跃按钮和英雄只跳一次,而不是连续跳跃。如果我按住向上按钮,它将继续跳跃,我不想要,即使按下按钮,我也只想让它跳跃一次。我想同样的双跳,我怎么能做到这一点。AS3:单键按

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.ui.Keyboard; 

    public class Player extends MovieClip 
    { 
     //Player run speed setting 
     var RunSpeed:Number = 8; 
     //Player key presses 
     var RightKeyPress:Boolean = false; 
     var LeftKeyPress:Boolean = false; 
     var UpKeyPress:Boolean = false; 
     //Jump variables 
     var Gravity:Number = 1.5; 
     var JumpPower:Number = 0; 
     var CanJump:Boolean = false; 
     var DoubleJump:Boolean = false; 

     public function Player() 
     { 
      // constructor code 
      stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyPressed); 
      addEventListener(Event.ENTER_FRAME,Update); 
      stage.addEventListener(KeyboardEvent.KEY_UP,KeyReleased); 
     } 

     function KeyPressed(event:KeyboardEvent) 
     { 
      //When Key is Down 
      if (event.keyCode == 39) 
      { 
       RightKeyPress = true; 
      } 

      if (event.keyCode == 37) 
      { 
       LeftKeyPress = true; 
      } 

      if (event.keyCode == 38) 
      { 
       UpKeyPress = true 

      } 
     } 

     function Update(event:Event) 
     { 
      //Adding gravity to the game world 
      JumpPower += Gravity; 
      //if player is more than 300 on the y-axis 
      if (this.y > 300) 
      { 
       //Player stays on the ground and can jump 
       JumpPower = 0; 
       CanJump = true; 
       DoubleJump = false; 
      } 

      //If player is on floor and right key is pressed then run right 
      if ((RightKeyPress && CanJump)) 
      { 
       x += RunSpeed; 
       gotoAndStop('Run'); 
       scaleX = 1; 
      } 
      else if ((LeftKeyPress && CanJump)) 
      { 
       //Otherwise if on floor and left key is pressed run left 
       x -= RunSpeed; 
       gotoAndStop('Run'); 
       scaleX = -1; 
      } 
      else if ((UpKeyPress && CanJump)) 
      { 
       //Otherwise if on floor and up key is pressed then jump 
       JumpPower = -15; 
       CanJump = false; 
       gotoAndStop('Jump'); 
       DoubleJump = true; 
      } 

      //If on floor and right and up key are pressed then jump 
      if ((RightKeyPress && UpKeyPress && CanJump)) 
      { 
       JumpPower = -15; 
       CanJump = false; 
       gotoAndStop('Jump'); 
       DoubleJump = true; 
      } 

      //If on floor and left and up key are pressed then jump 
      if ((LeftKeyPress && UpKeyPress && CanJump)) 
      { 
       JumpPower = -15; 
       CanJump = false; 
       gotoAndStop('Jump'); 
       DoubleJump = true; 
      } 

      //If jumped and right key is pressed then move right 
      if ((RightKeyPress && CanJump == false)) 
      { 
       x += RunSpeed; 
       scaleX = 1; 
      } 
      else if ((LeftKeyPress && CanJump == false)) 
      { 
       //Otherwise if jumped and left key is pressed then move left 
       x -= RunSpeed; 
       scaleX = -1; 
      } 

      //If in air and able to doublejump and pressed up key, then double jump 
      if (UpKeyPress && DoubleJump && JumpPower > -2) 
      { 
       JumpPower = -13; 
       DoubleJump = false; 
       gotoAndStop('DoubleJump'); 
      } 

      //If on floor and no key is presses stay idle 
      if ((!RightKeyPress && !LeftKeyPress && CanJump)) 
      { 
       gotoAndStop('Idle'); 
      } 

      this.y += JumpPower; 
     } 

     function KeyReleased(event:KeyboardEvent) 
     { 
      if (event.keyCode == 39) 
      { 
       event.keyCode = 0; 
       RightKeyPress = false; 
      } 

      if (event.keyCode == 37) 
      { 
       event.keyCode = 0; 
       LeftKeyPress = false; 
      } 

      if (event.keyCode == 38) 
      { 
       event.keyCode = 0; 
       UpKeyPress = false; 
      } 
     } 
    } 
} 
+0

你有没有尝试在双跳发生的地方放置一个断点?它看起来像布尔逻辑的逻辑应该正确工作,但是由于某种原因,你必须反复地在那个块中结束?尝试在更新函数的关键点追踪布尔值。 – shaunhusain

+0

@shaunhusain:断点?我对AS3有点新,所以我不太了解,但学得很快。 – user2350724

+0

没问题,检查此链接http://www.adobe.com/devnet/flash/articles/flash_as3_debugging.html或只是谷歌周围,似乎该文章的后半部分可能会有所帮助,但它很长。 – shaunhusain

回答

2

我怀疑是正在发生的事情是,只要你的播放机的Y值满足if (this.y > 300)你让他再跳一次,所以只要键被按下他跳,因为UpKeyPress && CanJump都成立的情况下。

我的猜测是,做类似下面可能让你更接近哟你的答案......

在你更新功能:

function Update(event:Event) 
{ 
    //Adding gravity to the game world 
    JumpPower += Gravity; 
    //if player is more than 300 on the y-axis 
    if (this.y > 300) 
    { 
     //Player stays on the ground and can jump 
     JumpPower = 0; 
     // Do not allow another jump until the UpKey is pressed 
     //CanJump = true; 
     //DoubleJump = false; 
    } 
    ... 

然后在您的keyPressed功能:

function KeyPressed(event:KeyboardEvent) 
{ 
    //When Key is Down 
    if (event.keyCode == 39) 
    { 
     RightKeyPress = true; 
    } 

    if (event.keyCode == 37) 
    { 
     LeftKeyPress = true; 
    } 

    if (event.keyCode == 38) 
    { 
     UpKeyPress = true 
     // Do not allow another jump until the UpKey is pressed 
     if (this.y > 300) 
     { 
      CanJump = true; 
      DoubleJump = false; 
     } 
    } 
} 

我也是第二个shaunhusain的建议,设置断点并适应调试代码。

+3

为了将来的参考,有一个枚举某些键的Keyboard类,所以你可以用Keyboard.UP替换38。 – Rich