Corri um problema no meu mecanismo Mega Man, e a estrutura do loop do meu jogo está dificultando a correção. Com o Rush Jet, ou qualquer outra plataforma em queda, o Mega Man precisa permanecer ligado à plataforma à medida que ela cai. No momento, o melhor que posso fazer (sem recorrer a soluções alternativas, como campos de força mágicos que o derrubam), permite que ele caia em um único quadro quando a plataforma começar a cair. Mas mesmo isso requer que a plataforma em queda o puxe para baixo durante a verificação de colisão. Sem esse passo extra, ele constantemente "treme" ao cair à medida que a plataforma desce.
A ordem dos eventos no meu loop do jogo está fazendo isso acontecer. É assim:
- Mega Man e Rush Jet estão voando horizontalmente por um tempo.
- Fase de pensamento: O jogador pressiona para baixo - a plataforma decide ajustar sua velocidade para baixo.
- Fase de ação: a plataforma se move para baixo, o jogador não tem consciência disso.
- Fase de reação: os dois não estão colidindo, portanto, nenhuma verificação de "força de ligação" pode ocorrer.
- No próximo quadro, Mega Man cai. Um quadro depois, a gravidade alcança e ele pousa na plataforma novamente, redefinindo sua velocidade y para 0.
Você pode ver lá a ordem básica do meu loop:
- Fase de reflexão, em que você analisa colisões do quadro anterior e quaisquer outras variáveis para decidir sobre transições de estado e outros ajustes.
- Fase de ação - todos se movem de acordo com sua velocidade.
- Fase de reação - verificações de colisão, ajuste as posições para corrigi-las. Isso também lida com efeitos como plataformas móveis, por exemplo. empurre o jogador por alguma quantia. As mudanças em sua velocidade são aplicadas no próximo quadro, durante a fase de ação.
Tentei reordenar essas etapas e várias outras alterações, mas todas pioram tudo, com todos os tipos de erros. Se eu precisar fazer mudanças radicais no meu mecanismo para corrigir essas coisas, prefiro saber qual é a maneira "correta" antes de perder tempo.
Eu sei que uma solução possível seria a etapa do movimento olhar para quem estava tocando a plataforma no quadro anterior e puxá-lo para que eles realmente se movessem juntos. Isso parece muito complexo, porém, atingindo componentes assim. Meu código de mecanismo já parece muito mais complicado do que o jogo original poderia ter sido, sugerindo que estou fazendo algo errado.
Então, existe uma sequência adequada de eventos? Há outra pergunta aqui sobre como mover as coisas junto com uma plataforma, mas isso não aborda a questão da ordem dos eventos que causa o meu problema. Além disso, se alguém realmente souber como os jogos clássicos do Mega Man fizeram isso, isso obviamente seria uma grande ajuda.
Encontre tanto do meu código quanto você deseja em https://github.com/Tesserex/C--MegaMan-Engine/tree/master/Mega%20Man . O CollisionComponent e MovementComponent pode ser o mais útil.