Determinando player.isFalling () através da mudança de y?

8

Atualmente, estou usando o Box2D e meu personagem é um monte de acessórios no Box2D. Eu queria saber se, para determinar se um jogador está caindo, detectar uma mudança na posição Y seria apropriado?

Existem outras maneiras em que não estou pensando? Como esse tipo de coisa geralmente é detectado?

jmasterx
fonte
2
Um jogador não teria uma velocidade descendente para indicar queda?
The Duck comunista
11
O que está "caindo" no seu caso, afinal? É uma velocidade descendente simples? É a não presença de uma superfície sólida imediatamente abaixo? Você está "caindo" quando seu personagem pula de um prédio e ainda está subindo, mas obviamente atingirá o concreto daqui a alguns segundos?
Anko
@Aku faling é a qualquer hora, não faria sentido para ele saltar (uma vez que nenhuma superfície para saltar fora de)
jmasterx
3
Normalmente, um mecanismo de física deve fornecer maneiras de verificar o normal de uma colisão. Se estiver "alto", significa que o seu jogador está de pé em alguma coisa e deve poder pular. Inversamente, se ele não estiver colidindo, ou se nenhuma das normais de colisão estiver apontando para cima, ele estará caindo.
Jonathan Connell
@Duck e @ 3nixios soa como boas respostas, por que não torná-lo .. respostas LHO;) I, iria para um upvote
Maik Semder

Respostas:

9

(Pelo meu comentário.) Não conheço o Box2D, mas normalmente um mecanismo de física deve fornecer maneiras de verificar o normal de uma colisão.

Se estiver "alto", significa que seu jogador está de pé em alguma coisa e deve poder pular.

Inversamente, se ele não estiver colidindo, ou se nenhuma das normais de colisão estiver apontando para cima, ele estará caindo.

Jonathan Connell
fonte
3

Você precisa de dois booleanos isColidingWithGroundeisJumping

Quando o usuário pressionar o botão de salto, se isColidingWithGroundfor truee isJumpingfor falso, chame o jump()que define isJumpingcomotrue

Se a yvelocidade do jogador é positiva, então isJumpingé igual afalse

Se o jogador estiver colidindo com o chão, éColidingWithGround igual true, senão isColidingWithGroundigualfalse .

Às vezes, o jogador ainda está em contato com o solo após o impulso inicial do salto, e acho que, ao usar essas duas bandeiras, impede que o salto () seja chamado várias vezes quando o salto é pressionado.

AttackingHobo
fonte
Usando este método, seria interessante verificar se a tecla de pular foi pressionada quando o jogador estava caindo e se foi pressionada como 200 ms antes de tocar o chão, ligue jump()novamente.
JCM
2

A maneira como lida com isso é que cada jogador possui um isJumpingbooleano que, quando pulam, é definido como true. Quando eles colidem com uma superfície, eu verifico se é algo do qual eles poderiam pular e outras estipulações, como estão em pé, etc., e coloco como false.

Então, quando eles tentam pular, se a superfície em que estão são bons e isJumping == falseeu permito que eles pulem, caso contrário eles não podem pular. Eu acho que isso é melhor do que calcular colisões toda vez que você quiser ver se elas estão pulando.

Editar
Como o @BlueRaja apontou abaixo, se o usuário sair da borda, isJumpingainda o será false. Você pode corrigir isso com o EndContactmétodo do Ouvinte de contato (consulte a seção 9.4 docs do Box2D . Você só precisa definir a isJumpingpropriedade para truequando a colisão com o mundo cessar.

Richard Marskell - Drackir
fonte
2
E se eles saírem da beira sem pular? isJumpingserá false, mas eles ainda não devem ser autorizados a saltar
BlueRaja - Danny Pflughoeft
@BlueRaja - Bom ponto. Eu esqueci disso, eu também tenho um controle sobre como quebrar colisões. Veja EndContactna versão 9.4 do Box2d Docs . Editar resposta atualizada.
Richard Marskell - Drackir
0

Mova todos os componentes relevantes do seu "monte de equipamentos" (que juntos formam o jogador) para baixo em uma pequena quantidade e verifique se há colisões com qualquer coisa que você considere possível pular. Se não houver colisão, o jogador está caindo. Caso contrário, ele não é. Não se esqueça de mover os componentes de volta na mesma quantidade.

Se seu personagem é humanóide, você provavelmente deve se mover e checar apenas os pés do personagem, caso contrário, seu personagem pode acabar sendo capaz de pular, mesmo estando em pé sobre a cabeça dele!

Anko
fonte
0

Isso pode ou não se aplicar, mas detectaríamos uma diferença entre pular / aterrissar e cair, para que soubéssemos quando trocar para uma animação em queda, causar danos por cair muito tempo (não muito longe;)) e similares.

Isso foi feito muito bem, rastreando quanto tempo um objeto ficou sem um ponto de referência. Qualquer coisa no chão, ou qualquer outro objeto, tinha uma referência ao que estava em pé. Não está em nada? Então você estava no ar e, após 1-2 segundos, estava "caindo" em vez de aterrissar graciosamente :)

James
fonte
0

De forma muito ingênua e simples, você pode verificar se o jogador tem uma velocidade y (velocidade, não velocidade) que é> 0, supondo que você esteja usando (0,0) como canto superior esquerdo.

O Pato Comunista
fonte