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?
Respostas:
(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.
fonte
Você precisa de dois booleanos
isColidingWithGround
eisJumping
Quando o usuário pressionar o botão de salto, se
isColidingWithGround
fortrue
eisJumping
for falso, chame ojump()
que defineisJumping
comotrue
Se a
y
velocidade do jogador é positiva, entãoisJumping
é igual afalse
Se o jogador estiver colidindo com o chão, éColidingWithGround igual
true
, senãoisColidingWithGround
igualfalse
.À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.
fonte
jump()
novamente.A maneira como lida com isso é que cada jogador possui um
isJumping
booleano que, quando pulam, é definido comotrue
. 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 comofalse
.Então, quando eles tentam pular, se a superfície em que estão são bons e
isJumping == false
eu 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,
isJumping
ainda o seráfalse
. Você pode corrigir isso com oEndContact
método do Ouvinte de contato (consulte a seção 9.4 docs do Box2D . Você só precisa definir aisJumping
propriedade paratrue
quando a colisão com o mundo cessar.fonte
isJumping
seráfalse
, mas eles ainda não devem ser autorizados a saltarEndContact
na versão 9.4 do Box2d Docs . Editar resposta atualizada.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!
fonte
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 :)
fonte
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.
fonte