Como fazer um personagem pular?

44

Atualmente, estou criando um jogo em C # usando o Direct X 9.0. O remake do jogo é Donkey Kong NES. Eu tenho quase tudo concluído, mas estou tendo problemas com a física do salto de Mario. Eu tenho variáveis ​​declaradas para as coordenadas Y e X.

Fiquei me perguntando se havia um método simples de fazer isso. Eu procurei alta e baixa por uma resposta, mas as respostas que encontrei são irrelevantes / ou estão usando uma linguagem de programação diferente, como o XNA.

Atualmente, tenho uma variável bool definida para verificar se W foi pressionado e isso acionará qualquer código para fazê-lo pular. Eu tenho mexido com coisas como.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

O que não funcionou tão bem. Procurei em alto e baixo por uma resposta e agora estou desesperado, se alguém pudesse me apontar na direção certa para uma solução simples. Isso seria bom. Muito apreciado por quaisquer respostas.

Sarah
fonte
5
Respostas usando uma linguagem de programação diferente não devem representar um problema. O algoritmo é o que interessa, não a implementação específica ... a menos que você apenas deseje copiar e colar sem entender nada, o que certamente espero que não! Ser capaz de ler e adaptar algoritmos de outras linguagens de programação é uma habilidade muito boa de se ter.
ccxvii

Respostas:

84

Primeiro de tudo, o XNA também usa C # também, por isso é a mesma linguagem de programação. E embora a API subjacente possa ter algumas diferenças em relação ao DirectX, isso não tem nada a ver com salto, portanto, os mesmos tutoriais ou respostas devem ser aplicados aqui. Além disso, existem várias maneiras de implementar isso, dependendo de muitos fatores. O que descreverei abaixo é apenas uma das possibilidades.

Requisitos básicos de física

Primeiro, você precisa de algumas variáveis ​​físicas básicas e cálculos no seu loop de atualização. Em particular, você precisa de posição, velocidade e gravidade definidas, e seu loop de atualização deve estar fazendo algo semelhante a isso (detecção e resposta de colisão omitidas por simplicidade):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Salto de altura fixa

Agora, a maneira mais fácil de implementar um salto que sempre tem a mesma altura, não importa quanto tempo você pressiona a tecla, é simplesmente alterar a velocidade vertical uma vez. Isso fará com que o personagem comece a subir, enquanto a gravidade cuidará automaticamente de derrubá-lo:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Importante Você não deseja iniciar um salto se o seu personagem não estiver no chão, portanto, será necessário adicionar uma verificação.

Salto de altura variável

Mas jogos como Mario e Sonic têm um salto variável, onde a altura do salto depende de quanto tempo você pressiona o botão. Nesse caso, você precisará lidar com pressionar e liberar a tecla de salto. Você pode adicionar algo como:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Ajustando todos esses valores (ou seja, os números como 0.5, -12.0fou -6.0f) no código acima, você pode alterar a sensação do seu salto, quão alto ele salta, quanto impulso ele mantém mesmo depois de soltar o botão de salto, quão rápido ele cai, etc. .

Importante Não chame essas funções de todos os quadros. Ligue para eles apenas uma vez quando a tecla for pressionada ou liberada. Caso contrário, seu personagem voará em vez de pular.

Exemplo de trabalho

Acabei de criar um exemplo rápido das técnicas descritas acima, que você pode experimentar no seu navegador aqui (pressione o botão do mouse para pular, solte-o no meio para controlar a altura do salto). Está em JS, mas como mencionei anteriormente, a linguagem é irrelevante neste caso.

http://jsfiddle.net/LyM87/

David Gouveia
fonte
11
Também é possível compartilhar este incrível artigo escrito há alguns dias com informações relacionadas a este tópico: O guia para a implementação de plataformas 2D . E também este: Sonic Jumping .
David Gouveia
2
O artigo descreve uma maneira diferente de fazer salto variável do que você fez na sua resposta. Ele exige a supressão da gravidade ou continua a adicionar o impulso enquanto o botão é pressionado. Eu costumo fazer o que Davi diz em sua resposta, mas há algum pensamento sobre os métodos do artigo?
25412 Jeff
@ Jeff Isso chamou minha atenção também, e é exatamente por isso que mencionei que existem várias maneiras de implementá-lo. O primeiro artigo descreve duas maneiras adicionais de lidar com o mesmo problema, enquanto a maneira que descrevi é baseada no segundo artigo. Não sei como eles se comparam, embora qualquer um deles seja muito fácil de implementar. No final, escolhi esse método porque era mais fácil de explicar e não exigia a adição de um temporizador ou a manipulação de múltiplos impulsos de magnitude decrescente.
David Gouveia
A resposta pode variar de acordo com o jogo específico e quantas animações você deseja fazer. Metroid usa um salto de velocidade constante: / descent, mas mascara-o com um trabalho de animação de alta qualidade para torná-lo suave e "curvado" no zênite. Muitos outros plataformas usam saltos de velocidade variável, que exigem mais trabalho para que funcionem bem.
Sean Middleditch
1
isso foi muito útil, 5 anos depois :) e essa coisa de violino é muito legal - eu deveria aprender JS!
Fluidity
1

Como na física. Somente no momento em que você pressiona jump keye o personagem está no chão, aumenta a velocidade (é chamado de impulso), mas faz o personagem cair pela gravidade o tempo todo.

Se você não quer que o personagem pule toda vez que atinge o chão - porque você está segurando jump key- adicione uma jump key is being pressedvariável que você limpa depois jump keyé liberada e colocada depois. Pseudo-código:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Se eu usasse o seu caminho:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Como donkey.ya mudança depende de sua imaginação. Velocidade deve ficar menor burro mais alto está no ar para torná-lo bom.

user712092
fonte