Estou fazendo um jogo 2D. Atualmente, existe um helicóptero voando, controlado pelo jogador. É controlado usando as teclas de seta: CIMA, ESQUERDA e DIREITA.
É a velocidade ao longo do eixo y dy
, e a velocidade ao longo do eixo x é dx
.
É física é a seguinte:
Sempre que UP não é pressionado , dy
acelera em constante aceleração, indefinidamente em direção a baixo. (Gravidade). dx
permanece no seu valor atual.
Quando UP é pressionado , dy
acelera em constante aceleração, independentemente do que é atualmente, até 4 (para cima, até atingir a velocidade 4). dx
permanece no seu valor atual.
Quando ESQUERDA é pressionado , dx
acelera em constante aceleração, de qualquer que seja o momento, até -4 .
Quando RIGHT é pressionado , o dx acelera em constante aceleração, de qualquer que seja o momento, até 4 .
(Quando ESQUERDA ou DIREITA são pressionadas e UP não é pressionada simultaneamente, como eu disse: dy
cada vez mais se torna cada vez menor, porque a gravidade está afetando o helicóptero)
Tudo isso faz o helicóptero seguir arcos no ar, em vez de linhas retas.
Isso cria física que parece bastante realista.
Minha pergunta é:
O helicóptero oponente, uma IA, deve se mover usando o mesmo sistema de física.
Digamos que a IA queira ir de onde está atualmente, para apontar B.
Se não houvesse gravidade nem aceleração gradual no jogo, seria fácil. Eu simplesmente desenharia um vetor da posição da IA para o ponto B e faria a AI segui-lo.
Mas como existe gravidade e aceleração gradual, a IA nunca pode se mover em linha reta (quase). qual seria a melhor maneira de fazer a IA ir para o ponto B, com a maior eficiência possível de tempo?
Como posso levar em consideração a gravidade ao mover a IA para um destino específico?
(Se for mais fácil explicar, considere o ponto B no mesmo nível no eixo y da IA e não na diagonal).
obrigado
Respostas:
tl; dr:
O mesmo com y. Lembre-se de limitar a velocidade, para que fique entre zero e a velocidade máxima. Se o inimigo tiver uma velocidade muito lenta em algum momento e tentar parar, poderá começar a se mover na direção oposta. Não permita. Pare se estiver diminuindo a velocidade e a velocidade estiver abaixo de 1 * Acc.
Versão longa: Se não houver obstáculos, o movimento no eixo y é completamente irrelevante para (e não afeta) o movimento no eixo x. Portanto, a pergunta que você descreve pode ser dividida em duas perguntas separadas.
CS.x
&CS.y
são a nossa velocidade atual nos eixos x e y.TS.x
&TS.y
É o tempo que levaria para que você parasse apenas na vertical ou na horizontal, considerando sua velocidade atual no eixo relevante.D.x
&D.y
são a distância em cada eixo.tl; dr: você continua a acelerar (se possível [a menos que tenha atingido a velocidade máxima]) no eixo x até chegar a um ponto onde a seguinte condição é verdadeira:
O mesmo com y.
fonte
Uma abordagem que usei para um problema semelhante foi primeiro desenhar um vetor no alvo e depois compará-lo com a direção da velocidade atual.
Portanto, pegue o ângulo assinado entre o vetor de velocidade e o vetor de destino e aplique um impulso em relação ao tamanho do vetor.
Portanto, se o ângulo a entre o vetor de velocidade vermelho e o vetor de alvo verde for negativo, aplique um impulso positivo; caso contrário, não aplique nenhum impulso e deixe a gravidade resolvê-lo.
Observe que você terá que tratar os quatro quadrantes onde o alvo pode ser diferente (como se o alvo estivesse no canto superior esquerdo, um ângulo positivo exigiria a aplicação de impulso).
Além disso, certifique-se de aplicar a quantidade de empuxo em relação ao desvio da velocidade alvo.
Tecnicamente, isso não está levando em consideração a gravidade, está compensando o estado atual e significa que o helicóptero da IA pode não voar em linha reta com o alvo, mas oscilará um pouco. Isso pode ou não funcionar para o seu jogo.
fonte
Você pode simplesmente recalcular o movimento a cada X quadro. Supondo que você não coloque muitos quadros no meio, mas o suficiente para não afetar o desempenho, a gravidade de um helicóptero não deve ser forte o suficiente para realmente ver a trajetória mudando. Além disso, acho que um jogador poderia se mover da mesma maneira, adaptando-se à gravidade enquanto se movia e não planejando.
fonte