2014-10-28 47 views
4

我想让一个2D平台游戏者是我想让我的角色能够双重跳转。c中的双跳#

使用此代码,我的角色可以双跳,但取决于我按下跳跃按钮的快慢,第二次跳跃会使角色跳跃两倍以上,而不是等待按下跳跃按钮。

如何让第二跳不能比第一跳高?

[SerializeField] float maxSpeed = 10f;    // The fastest the player can travel in the x axis. 
[SerializeField] float jumpForce = 400f;   // Amount of force added when the player jumps. 

[Range(0, 1)] 
[SerializeField] float crouchSpeed = .36f;   // Amount of maxSpeed applied to crouching movement. 1 = 100% 

[SerializeField] bool airControl = false;   // Whether or not a player can steer while jumping; 
[SerializeField] LayerMask whatIsGround;   // A mask determining what is ground to the character 

Transform groundCheck;        // A position marking where to check if the player is grounded. 
float groundedRadius = .2f;       // Radius of the overlap circle to determine if grounded 
bool grounded = false;        // Whether or not the player is grounded. 
Transform ceilingCheck;        // A position marking where to check for ceilings 
float ceilingRadius = .01f;       // Radius of the overlap circle to determine if the player can stand up 
Animator anim;          // Reference to the player's animator component. 

int maxNumberOfAirJumps = 1;      // Number of times the player can jump in the air 
int numberOfAirJumpsLeft = 0; 



void Awake() 
{ 
    // Setting up references. 
    groundCheck = transform.Find("GroundCheck"); 
    ceilingCheck = transform.Find("CeilingCheck"); 
    anim = GetComponent<Animator>(); 
} 


void FixedUpdate() 
{ 
    // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground 
    grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround); 
    anim.SetBool("Ground", grounded); 

    // Set the vertical animation 
    anim.SetFloat("vSpeed", rigidbody2D.velocity.y); 
} 


public void Move(float move, bool crouch, bool jump) 
{  
    // If crouching, check to see if the character can stand up 
    if(!crouch && anim.GetBool("Crouch")) 
    { 
     // If the character has a ceiling preventing them from standing up, keep them crouching 
     if(Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround)) 
      crouch = true; 
    } 

    // Set whether or not the character is crouching in the animator 
    anim.SetBool("Crouch", crouch); 

    //only control the player if grounded or airControl is turned on 
    if(grounded || airControl) 
    { 
     // Reduce the speed if crouching by the crouchSpeed multiplier 
     move = (crouch ? move * crouchSpeed : move); 

     // The Speed animator parameter is set to the absolute value of the horizontal input. 
     anim.SetFloat("Speed", Mathf.Abs(move)); 

     // Move the character 
     rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y); 

     // If the input is moving the player right and the player is facing left... 
     if(move > 0 && !facingRight) 
      // ... flip the player. 
      Flip(); 
     // Otherwise if the input is moving the player left and the player is facing right... 
     else if(move < 0 && facingRight) 
      // ... flip the player. 
      Flip(); 
    } 

    // If the player should jump... 
    if (grounded && jump) { 
     // Add a vertical force to the player. 
     anim.SetBool ("Ground", false); 
     rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
     numberOfAirJumpsLeft = maxNumberOfAirJumps; //Reset the air jumps when the player jumps 
    } 
    else if (!grounded && jump && numberOfAirJumpsLeft > 0) 
    { 
     rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
     numberOfAirJumpsLeft--; //One less jump 
    } 
} 


void Flip() 
{ 
    // Switch the way the player is labelled as facing. 
    facingRight = !facingRight; 

    // Multiply the player's x local scale by -1. 
    Vector3 theScale = transform.localScale; 
    theScale.x *= -1; 
    transform.localScale = theScale; 
} 
void OnTriggerEnter(Collider col) 
{ 

    if (col.tag == "Player") 
    { 
     //money collected 

     //destroy money object 
     Destroy(gameObject); 
    } 
} 

}

+7

“..对于坏格式抱歉。” - 接受道歉。现在,不要为此道歉,去解决它;) – 2014-10-28 13:43:43

+0

取决于你希望如何。当玩家进行第二次跳跃时,您需要从第一次跳跃中取消所有力量并像正常一样添加第二次跳跃。换句话说,当玩家进行第二次跳跃时,假装他正在一个坚实的平台上休息并跳跃。 – 2015-06-23 19:27:04

回答

0

每天Move之前调用FixedUpdate?如果是这样,它会根据半径重置接地,所以如果速度足够快,您可以进行第二次“接地”跳跃。然后,你可以再做一次airjump。

+1

FixedUpdate每运行一次物理帧(每次游戏物理更新)时,每个渲染帧可能会发生几次 – maksymiuk 2015-06-23 19:01:47

0

我不善于游戏开发,所以我会提出一个建议,我认为应该工作。

第一次跳跃后需要减少jumpForce,或者在每次空中跳跃后增加较少的力量。它应该是这样的:

//Declare int numberOfAirJumpsMade = 1; 
if (grounded && jump) { 
    // Add a vertical force to the player. 
    anim.SetBool ("Ground", false); 
    rigidbody2D.AddForce (new Vector2 (0f, jumpForce)); 
    numberOfAirJumpsLeft = maxNumberOfAirJumps; //Reset the air jumps when the player jumps 
    numberOfAirJumpsMade = 1; //reset air jump counter 
}  
else if (!grounded && jump && numberOfAirJumpsLeft > 0) 
{ 
    rigidbody2D.AddForce (new Vector2 (0f, jumpForce/(numberOfAirJumpsMade * 2))); 
    numberOfAirJumpsLeft--; //One less jump 
    numberOfAirJumpsMade++; 
} 

在这里,你在第一跳空气少2倍力比你在地面跳跃没有增加。如果你设置了maxNumberOfAirJumps = 2,那么第一次跳空得到(400 /(1 * 2)) = 200的力,第二次得到(400 /(2 * 2)) = 100

这只是为了让你开始。之后你可能想要在计算中增加重力,因为当你的英雄登陆时,你可能想要为空中跳跃增加更少的力量。