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.
Respostas:
Sei que esta resposta não se encaixa no título desta pergunta, mas acho que poderia resolver seu problema.
Eu olhei para sua base de código e você tem um design de componente agregado para compor entidades de jogos. Eu estou supondo que o rush jet tem sua própria entidade de jogo e lista de componentes ("rush jet" é o que chamarei de plataforma móvel, sim, não sei nada sobre jogos mega man). Se for esse o caso, você deve tentar passar pelo rush jet uma entidade de jogo de jogador e criar algum tipo de ponte (não é o melhor termo para usar).
Para essa "ponte", o jato do rush não recebe informações do teclado. Em vez disso, o jogador receberia informações e, em seu sistema de mensagens (o dos componentes do jogo em uma entidade), você poderia ter outro componente do jogo vinculado ao jet jet que também interceptaria a mensagem de movimento. Assim, o jogador e a plataforma seriam movidos juntos. Depois que o jato de corrida acabar, o componente do jogo que serve como ponte entre o jato de corrida e o jogador será descartado e removido.
Eu acho que essa é uma alternativa plausível. O movimento ocorre no loop do jogo e, em seguida, ocorrem as verificações de colisão para garantir que o jet rush e o jogador estejam dentro dos limites. Eu também acredito que é perfeitamente bom que o rush jet dependa do jogador dessa maneira. Não é a solução mais sublime, mas provavelmente funcionará.
PS: Eu gosto da sua base de código. O código não é o melhor, mas é legal.
fonte
Ok, então, na sua forma mais básica, um loop de jogo se parece com isso:
No seu caso, o que deve acontecer é:
E é assim que a maioria dos jogos que escrevo faz com que funcione.
Atualização: Se você precisar de mais informações sobre como escrever um bom ciclo de jogo, veja agora mais além deste bom guia .
fonte