2013-08-01 69 views
0

所以我的马里奥项目必须包括一个马里奥的运动主食,当然是跳选择一个短的高度或相当大的一个选项。众所周知,按住跳跃按钮可以让他跳得更高,这就是我的目标。在我的情况下,该按钮是X,我不确定如何做到这一点。AS3扩展跳转时按住按钮

这是我目前不成功的尝试,并且在我的变量中默认情况下重力被设置为0.87。

这是我keyDownHandler(按下该键时)

if (event.keyCode == Keyboard.X && onGround == true) 
     { 
      vy += jumpForce; 
      holdJump = true; 
      onGround = false; 

      if(holdJump == true && onGround == false) 
      { 
       _mario.y += 1; 
      } 
      else 
      { 
       vy = vy + (grav * 0.20); 
       holdJump = false; 
      } 

这是我keyUpHandler(当键没有按下/放开)

if (event.keyCode == Keyboard.X) 
     { 
      if (holdJump == false) 
      { 
       accy = 0; 
       gravity = 0.80; 
       incSpeedY = 0; 
      } 
     } 
+1

您可以使用标准的'VY = vyLast-G *(T-TLAST)',和刚刚成立'vyLast'到'分钟(0,vyLast ),当跳跃键被释放时,并且当在地面上按下跳跃键时将其设置为跳跃起始速度。 – user1875642

+0

对不起,我只学了一个月左右的AS3,我不太清楚你的意思,也许你可以在代码中使用它作为例子吗? –

回答

0

好吧,我我已发表了我的评论。

您可以使用标准vy=vyLast-g*(t-tLast),以及刚刚成立vyLastmin(0,vyLast)当跳跃键被释放,并设置它时被压在地上跳跃键跳跃启动速度。

以下是带有跳跃红圈的示例Adobe Air应用程序。它实现了我所描述成注释的逻辑:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"     
         > 
    <fx:Script> 
     <![CDATA[ 
      import flash.utils.getTimer; 
      import mx.graphics.SolidColor; 
      public var marioY:Number = 0; //jump height above ground (meters) 
      public var g:Number = -9.81; //meter/(second^2) 
      public var lastTime:Number = NaN; 
      public var lastVerticalSpeed:Number = 0;//speed of a flight -meters/second 
      public var jumpSpeed:Number = 10;//initial jump speed - meters/second 
      public var timeRatio:Number = 1000;//milliseconds in a second 
      public var heightRatio:Number = 50; //pixels/meter 

      protected function get landed():Boolean{ 
       return marioY <= 0 && lastVerticalSpeed <= 0; 
      } 

      protected function onKeyDown(event:KeyboardEvent):void{ 
       if(event.keyCode==Keyboard.UP && landed){ 
        lastVerticalSpeed = jumpSpeed; 
        trace('fly!'); 
       }    
      } 

      protected function onKeyUp(event:KeyboardEvent):void{ 
       if(event.keyCode==Keyboard.UP){ 
        lastVerticalSpeed = Math.min(0,lastVerticalSpeed); 
        trace('fall!'); 
       } 

      } 

      protected function onEnterFrame(event:Event):void{ 
       if(!isNaN(lastTime)){ 
        var deltaTime:Number = (getTimer() - lastTime)/timeRatio;     
        marioY+=lastVerticalSpeed*deltaTime; 
        if(landed){ 
         lastVerticalSpeed=0; 
         marioY=0; 
        }else{ 
         lastVerticalSpeed+=g*deltaTime; 
        } 
       } 
       mario.y=area.height-marioY*heightRatio-20; 
       lastTime = getTimer();    
      } 

     ]]> 
    </fx:Script> 
    <s:Group width="100%" height="100%" keyDown="onKeyDown(event)" keyUp="onKeyUp(event)" 
      enterFrame="onEnterFrame(event)" id="area" 
      creationComplete="area.setFocus()" 
      > 
     <s:Rect width="100%" height="100%" fill="{new SolidColor(0x0000FF)}"/> 
     <s:Ellipse id="mario" width="10" height="10" fill="{new SolidColor(0xFF0000)}" 
        y="100" x="100" 
        /> 

    </s:Group> 
</s:WindowedApplication>