Como posso fazer o jogador pular mais alto se a tecla de pular for mantida pressionada por mais tempo? Atualmente, estou apenas reduzindo a gravidade enquanto a tecla estiver pressionada e o jogador estiver pulando, mas isso parece estranho.
side-scroller
John Stimac
fonte
fonte
Respostas:
Primeiro, você precisa decidir como será o salto.
Na vida real, a altura do salto é decidida no momento em que você sai do chão. Você não pode continuar pulando mais alto enquanto já está no ar.
Portanto, se você pode controlar a altura do seu salto enquanto já está no ar, obterá algum tipo de efeito semelhante ao "jet-pack".
Parece que me lembro de um side-scroller que tinha duas alturas de salto diferentes, acho que foi um dos jogos do super mario. O salto mais alto ocorreu quando você segurou o botão de salto, e o salto foi na verdade um salto de duas partes, começando com o salto regular inicial, seguido de um segundo impulso que o levou mais alto.
Então, como você quer que seu salto seja? Que tipo de controle você quer que o jogador tenha sobre o salto?
O que eu começaria é o seguinte:
Deixe a gravidade em paz (ou seja, nunca mude). Quando um jogador pressiona o botão de salto, aplique a força de salto enquanto o jogador estiver pressionando o botão de salto (até um certo limite de tempo). Então, quando o jogador solta o botão de pular, ele não pode aplicar nenhuma força de pulo novamente (ou seja, ele não pode iniciar um pulo novamente) até que ele toque o chão primeiro, quando os saltos serão reativados.
fonte
super meat boy
, que eu acho que tem o mesmo efeito de salto que você deseja, parece que, enquanto você pressiona o botão de salto, uma força é aplicada ao personagem, é oposta à gravidade e menor que ele. resto é como o que Alhovsky disse. se eu implementasse algo assim, começaria com algo entre 60% e 80% de gravidade como força de salto.Eu já vi algumas pessoas fazendo isso:
Crie uma variável (eu chamo
jumpTime
) de número (double / float). Quando a tecla de salto é pressionada, definajumpTime
para algum número (ou seja,0.5
este será o número de segundos que a pressão da tecla de salto terá efeito).Em seguida, para cada etapa, a velocidade definida para
jumpTime
multiplicado por algum outro número, e diminuirjumpTime
pordelta
(a diferença de tempo entre cada passo).Repita isso até
jumpTime
chegar a zero ou abaixo, ou quando o jogador soltar a tecla de pular. Depois que isso acontecer, use a física normal (aplique uma aceleração negativa constante até que o jogador alcance o chão).Pode ser necessário usar tentativa e erro (ou "suposição lógica") para encontrar valores adequados para esses "alguns números", a menos que você saiba como fazê-lo.
ATUALIZAÇÃO: Encontrei o truque que torna o salto um pouco mais realista (já que originalmente é lento, mas rápido). Mario infinito também usa a seguinte linha (versão 293 do Character.js da versão JavaScript) ...
this.Ya *= 0.85;
Isso é simplesmente como "arrastar o ar" e limita / diminui a velocidade do personagem quando está no ar. Assim, todo quadro, multiplique a velocidade y (velocidade vertical) por um número menor que um, para que diminua a velocidade ao cair novamente (e, portanto, tanto para cima quanto para baixo durante um salto será semelhante e mais realista). Eu sei, sou péssima em explicar ...Quando o personagem pula usando o método que eu descrevi acima, ele "sobe" mais rápido do que "cai para baixo". O arrasto, no entanto, diminui a velocidade vertical. Como definimos a velocidade vertical como proporcional a
jumpTime
todos os quadros, esse arrasto não afeta muito a primeira metade do salto. No entanto, na metade seguinte (voltando para baixo), a velocidade vertical não é definida em todos os quadros, mas simplesmente adicionada por outro número (nesse caso, é a constante gravitacional). Portanto, o arrasto entra em vigor na queda e, como diminui a velocidade (em qualquer direção), diminui a velocidade da queda, tornando-a semelhante à primeira metade.Existem outras maneiras de resolver esse problema, como diminuir o efeito da gravidade no personagem quando ele cai. No entanto, precisamos descobrir quanto devemos reduzir a gravidade.
Estudo de caso: Mario infinito
Foi o que eu encontrei (da linha 206 do Mario.java de Markus Persson (Notch)):
A versão javascript é basicamente a mesma https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js
Isso é semelhante à sugestão de Olhovsky, mas neste caso a força será proporcional à quantidade de tempo decorrido após o jogador pressionar a tecla de pular.
Minha versão javascript:
No entanto, alguns valores para as constantes (por exemplo, "gravityConstant" e "jumpConstant") darão um salto irrealista. Mas às vezes os jogos não precisam ser realistas! ( atualização, consulte a seção de atualização acima)
Esta pergunta já tem mais de um ano, mas espero que ajude!
fonte
Como Olhovsky disse, a altura do salto é decidida no momento em que você sai do chão, não depois disso.
Se você realmente deseja evitar o efeito do jetpack, vejo apenas duas maneiras: uma combinação de teclas para pular mais alto ou alterar fundamentalmente a maneira como a tecla de pular funciona:
Em vez de fazer o jogador pular assim que a tecla for pressionada, adie o salto até que a tecla seja liberada . Então, basicamente, a duração do pressionamento de tecla controla quanta tensão de mola nas pernas do jogador é construída e liberada posteriormente.
Obviamente, isso altera fundamentalmente a mecânica do jogo e pode não ser familiar para o jogador. Mas o efeito pode ser bastante interessante e pode valer a pena o desconhecimento.
fonte
Encontrei outra solução na resposta de David Gouveia à pergunta " Como fazer um personagem pular? "
Resumo:
Sua idéia era definir uma velocidade quando o jogador pressionasse o botão de pular. Em cada quadro, apenas calcula a gravidade. No entanto, quando o jogador solta o botão, ele define a velocidade para um valor menor se a velocidade for maior que ela. A velocidade é apenas decrementada em cada quadro pela gravidade.
Eu não devo roubar a resposta dele, então vá em frente e leia o post dele. Sua solução está na seção " Salto de altura variável ".
Então, na verdade, as pessoas criaram várias maneiras diferentes de resolver esse problema ...
http://excitemike.com/JumpingControlTester (ilustra diferentes mecanismos de salto em vários jogos)
http://meyermike.com/wp/?p=175 (também discute o caminho de salto de Mario)
http://www.flatredball.com/frb/docs/index.php?title=Tutoriais:Platforer:Variable-Height_Jumps (descreve três métodos diferentes)
possivelmente mais (não passou por muitos resultados de pesquisa, mas pesquisar no Google "altura variável do salto" ajuda)
fonte