Boa física 2D de plataformas [fechada]

76

Eu tenho um controlador de caracteres básico configurado para um jogo de plataformas 2D com Box2D e estou começando a ajustá-lo para tentar fazê-lo se sentir bem. Os mecanismos de física têm muitos botões para ajustar, e não está claro para mim, escrevendo com um mecanismo de física pela primeira vez, quais devo usar. O salto deve aplicar uma força para vários carrapatos? Um impulso? Definir velocidade diretamente? Como faço para impedir que o avatar cole nas paredes sem remover todo o atrito (ou retiro todo o atrito, mas apenas no ar)? Devo modelar o personagem como uma cápsula? Uma caixa com cantos arredondados? Uma caixa com duas rodas? Apenas uma roda grande? Eu sinto que alguém deve ter feito isso antes!

Parece haver muito poucos recursos disponíveis na Web que não são a "primeira física do bebê", todos cortados onde espero que alguém já tenha resolvido os problemas. A maioria dos exemplos de mecanismos de física para plataformas tem controles flutuantes, saltos no ar ou comportamento facilmente explorável quando a penetração temporária é muito alta, etc.

Alguns exemplos do que quero dizer:

  • Um pequeno toque de salto salta a uma curta distância; uma torneira longa salta mais alto.
  • Deslizamentos curtos ao parar ou reverter as direções em alta velocidade.
  • De pé de forma estável em declives (mas talvez deslizando para baixo quando se esquivar).
  • Velocidade analógica ao usar um controlador analógico.
  • Todas as outras coisas que separam bons criadores de plataforma dos ruins.
  • Ouso sugerir plataformas móveis estáveis?

Eu realmente não estou procurando "ei, faça isso". Obviamente, a coisa certa a fazer depende do que eu quero no jogo. Mas espero que alguém em algum lugar tenha examinado as possibilidades e tenha dito "a técnica bem A apresenta X bem, a técnica B bem Y, mas isso não funciona com C", ou tem alguns exemplos funcionados além "if (key = = espaço) character.impulse (0, 1) "

Josh
fonte

Respostas:

25

É bastante complicado implementar, digamos, física 'tipo Mario' usando um mecanismo de física real.

A última vez que tentei, usando o Chipmunk, modelei o jogador como 2 círculos - um 'círculo corporal' em cima de um 'círculo pés'

O 'círculo dos pés' tinha algum atrito, não era saltitante e era relativamente pequeno. O 'círculo corporal' era maior e sem atrito, para evitar a aderência a paredes / encostas íngremes

O objeto foi restringido para não permitir rotação - ele apenas deslizava

Se os 'pés' tocarem em alguma coisa ou estiverem dentro dos últimos quadros (para permitir cair em declives), o jogador foi considerado no chão (pode também ter verificado a superfície normalmente)

Faz um tempo desde que eu olhei o código, mas o comportamento foi semelhante ao:

Quando no chão:

  • Aplique 'gravidade adicional' (força descendente para ajudar na descida de ladeiras)
  • Aplique atrito ao solo (maior quantidade de amortecimento horizontal)
  • Aplique força de movimento esquerda / direita, com base nos controles.
  • (Reduza a força de movimento esquerda / direita conforme se aproxima da velocidade máxima de execução)
  • Se o salto for pressionado, aplique impulso para cima

Quando estiver no ar:

  • Aplique resistência ao ar (pequena quantidade de amortecimento horizontal)
  • Aplique gravidade regular (ou reduzida)
  • Aplique força de movimento esquerda / direita, se você estiver permitindo o controle no ar

Você precisa ter um pouco de cuidado ao alternar entre os dois estados - lembre-se de que, ao descer uma ladeira, você pode deixar o terreno por alguns quadros - provavelmente não deseja mudar de estado / não permitir saltar nesse ponto

No entanto, algumas outras coisas a serem observadas ... podem ser difíceis de implementar, as plataformas de 'jump-up-through' e, quando você começa a fazer coisas divertidas (plataformas móveis, mundos rotativos, etc.), você precisa ter cuidado para certifique-se de que o jogador não fique preso / esmagado por qualquer objeto em movimento 'movido por animação'.

bluescrn
fonte
Eu sei que esta é uma resposta bastante antiga, mas tenho algumas perguntas sobre isso. 1) Como você resolve o "mantenha a mesma velocidade em qualquer terreno em que esteja?" 2) Se você usa um pequeno círculo para os pés e um círculo maior para o corpo, o jogador não fica pendurado nas bordas algumas vezes? Estou realmente interessado em sua abordagem.
Notbad
18

Honestamente, não acho que o uso de um mecanismo de física seja a abordagem certa para algo desse tamanho de domínio com requisitos super rígidos.

Basta escrever tudo sozinho. Você obterá resultados muito melhores dizendo "mova o caractere para cima por x unidades nesta forma de parábola ao manter pressionado o botão de salto para o comprimento y" do que tendo vários botões para ajustar.

Tetrad
fonte
Eu fiz isso várias vezes no passado. Funciona até certo ponto, mas você sempre acaba jogando algo fora, porque é "muito difícil" fazer a física corretamente com um controlador hacky. Nesse jogo em particular, espero envolver algumas mecânicas de mola / corda para o movimento do jogador, e isso cruzou o reino de "Prefiro invadir um motor de física real" em vez de "Prefiro abrir uma caixa motor".
3
Prefiro acionar um movedor de caixas, pelo menos não pode ser instável, enquanto um mecanismo de física tende a explodir se você lançar muitas forças nele, porque você precisa restringir os movimentos a especificações exatas (e as restrições do mecanismo de física são) rígidos, eles podem apenas tentar cumprir muito). Além disso, aplicar forças para resolver um problema indesejado tende a influenciar todo o resto, levando ao inferno.
Kaj
10

Escrevi uma série de artigos sobre a criação de um jogo de plataforma desde o início usando tecnologias modernas e inclui como eu lidei com a física simples:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

No entanto, se você quiser algo mais de alta tecnologia, é perfeitamente possível abordar isso usando um mecanismo de física completo. Aqui está uma técnica que você pode usar (do Little Big Planet) que torna o personagem do jogador uma parte totalmente integrada do mecanismo de física:

Em vez de aplicar impulsos ou definir velocidades para mover o jogador como 'entradas externas' para o mecanismo de física, você pode desenvolver uma restrição que controla o personagem.

Portanto, essa restrição terá a velocidade e a direção desejadas do jogador como entrada (do jogo) e modelará coisas como a força e velocidade máximas do jogador. A restrição tentará mover o jogador de acordo com suas entradas (e obedecendo aos máximos) e, por ser uma restrição, aplicará uma força igual e oposta ao objeto em que o jogador está, permitindo assim que o jogador fique em plataformas móveis e afetar as coisas sobre as quais ele se move.

Fazer coisas assim significa que o jogador pode, naturalmente, ser capaz de lidar com situações como estar sob uma pilha enorme de caixas ou pular em várias plataformas móveis, porque ele agora é uma parte essencial do mecanismo de física.

Espero que ajude!

Saúde, Paul.

wildbunny
fonte
6

Esta questão teve uma discussão significativa nos fóruns do Box2D. Lendo as discussões sobre movimento de personagens, saltos ou plataformas, você encontrará todas as questões possíveis. No entanto, o problema ficou complicado o suficiente para que o sistema de filtragem de colisões fosse atualizado e um exemplo do Test Bed criado exclusivamente para mostrar como deveria ser feito.

deft_code
fonte