2013-05-31 31 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