2013-04-02 6 views
0

Я ищу простой метод для своей игры, так что, когда вы удерживаете пробел, вы прыгаете выше. Когда вы нажимаете «вы не прыгаете на максимальную высоту. Там должно быть максимум, но да, я не знаю, как это программировать.XNA - Держите дольше, чтобы прыгать выше

Anyhelp, очень ценится. Обратная связь будет предоставлена. Благодарю.

+2

Проанализировали ли вы работу с кнопками вниз и активировали события как отдельные события, а затем задали интервал между ними? – ChrisF

ответ

3

В вашей функции обновления, которая управляет прыжками, вы можете отслеживать, как долго персонаж находился с земли, и увеличивать скорость вверх по истечении определенного количества времени.

Например, что-то вроде следующего должно работать

class Player 
{ 
    private const int gravity = 2; //force of gravity on the object 
    private const int maxHeight = 5; //change as needed 
    private const int msecsToMax = 1500; //change as needed 

    private int yPos = 0; 
    private int timeOffGround = 0; 
    private yVel = 0; 

    //other functions and stuff 

    void update(GameTime gt) 
    { 
     //check if the player is on the ground and update as necessary 
     if(isOnGround()) 
      timeOffGround = 0; 
     else 
      timeOffGround += gt.ElapsedGameTime.TotalMilliseconds; 

     //update the player's velocity 
     yVel -= isOnGround() ? 0 : gravity; //no velocity when on the ground 
     if(Keyboard.GetState().IsKeyDown(Keys.SPACE) && timeOffGround < msecsToMax)) 
      yVel += (maxHeight/msecToMax); 

     yPos += yVel; 
    } 
} 
+0

Я очень новичок в XNA, и, поставив это на образец платформера, я получаю несколько ошибок. Вот класс игрока, если бы вы были так добры и взглянули на него: http://pastie.org/private/peoms14ouzcgxzwi1vajfa – user1631026

+1

Не могли бы вы опубликовать, что у вас была ошибка? Также, просматривая код, он должен прыгать только один раз, когда нажата кнопка пробела, потому что u никогда не возвращается к нулю. В вашем методе ввода вы можете добавить что-то вроде 'if (isJumping &&! KeyState.IsKeyDown (Keys.Space)) u = 0;' – Lindenk

1

Во ударением прыжка, скорость Y полностью переопределен кривой мощности. Во время приличной силы тяжести принимает . Скорость скачка регулируется полем jumpTime , которое измеряет время в акценте текущего скачка.

Во-первых вам понадобятся некоторые простые глобальные переменные,

public bool isJumping; //Is the player in a jump? 
private bool wasJumping; //Did the player just exit a jump? 
private float jumpTime; //Time the player has been in a jump (Useful for adding a power curve or to max out on jump height) 

MaxJumpTime = .8f; //If you want to max out a jump, otherwise remove the relevant parts of the code 
JumpLaunchVelocity = -3000.0f; //How much velocity to "jump" with, this may depend on your speed of your player, so it will need some ajustment 

Вот функция, которая делает большую часть работы:

private float DoJump(float velocityY, GameTime gameTime) 
     { 
      // If the player wants to jump 
      if (isJumping) 
      { 
       // Begin or continue a jump 
       if ((!wasJumping && IsOnGround) || jumpTime > 0.0f) 
       { 
        //Do things like animate, or play a sound here 
        jumpTime += (float)gameTime.ElapsedGameTime.TotalSeconds; 
       } 

       // If we are in the ascent of the jump 
       if (0.0f < jumpTime && jumpTime <= MaxJumpTime) 
       { 
        // Fully override the vertical velocity with a power curve that gives players more control over the top of the jump (If you dont want this you can remove the Math.Pow) 
        velocityY = JumpLaunchVelocity * (1.0f - (float)Math.Pow(jumpTime/MaxJumpTime, JumpControlPower)); 
       } 
       else 
        jumpTime = 0.0f; // Reached the apex of the jump 
      } 
      else 
      { 
       // Continues not jumping or cancels a jump in progress 
       jumpTime = 0.0f; 
      } 
      wasJumping = isJumping; 

      return velocityY; 
     } 

В вашем обновлении при вычислении позиции и прочее:

velocity.Y = DoJump(velocity.Y, gameTime); 

Посмотрите на Platformer Starter Kit, если у вас возникнут проблемы s!

Смежные вопросы