Cursos / Jogos Digitais / Inteligência Artificial para Jogos / Aula
Como dito anteriormente, o comportamento Arrival é bem similar ao Seek. A diferença é que ele deve reduzir a velocidade ao se aproximar do destino. Bom, “se aproximar” é algo vago para o computador. É necessário especificar a que distância ele deve começar a frear. Para isso, defina um novo atributo público na classe, chamado de arrivalDistance, que representará a distância do NPC para o destino na qual ele começará a “pisar no freio”.
Pisar no freio na matemática vetorial é aplicar uma força contrária à velocidade atual, porém de menor intensidade, pois você não quer que pareça que o jogador bateu numa “parede invisível”. Ele precisa ir parando aos poucos.
Quanto de força, então, deve-se aplicar? Se você aplicar um valor fixo a cada atualização, o NPC pode parar antes do destino… ou até depois de ter passado do destino.
Uma forma de resolver esse problema é aplicar menos força em direção ao destino à medida que o NPC se aproxima dele. Nesse caso, você pode usar uma função de atenuação da velocidade desejada em relação à distância, de tal forma que quando a distância chegar a zero a velocidade deve ser também zero (o que significa que o jogador estará parado). Ou seja, quanto mais o jogador se aproxima do destino, mais sua velocidade vai se aproximando de zero.
Há várias maneiras de implementar uma função de atenuação, porém a mais simples, e por isso, a mais usada, é através de uma interpolação linear. Uma regra de três simples entre a distância e a velocidade de início do freio e a distância e a velocidade atual do jogador pode resolver o caso, como ilustra a Figura 12.
Pela regra de três, o freio é apenas uma questão de multiplicar o vetor de velocidade desejada pela fração das distâncias, especificada abaixo.
$$ fração\thinspace de \thinspace distãncia = \frac{distância \thinspace atual}{distância \thinspace do \thinspace início \thinspace do \thinspace freio} $$
A implementação da ideia descrita encontra-se no Código 03. Nele, introduz-se o método SetMagnitude(), uma vez que os vetores estão sempre sendo reajustados com um determinado tamanho. Crie, então, um método para simplificar o código.
Veja que o método Arrival() possui três casos. O primeiro é quando o NPC já se encontra muito próximo do alvo (distância menor que a constante stopVal). Nesse caso, esqueça as forças de navegação e retorne simplesmente uma força contrária a atual velocidade do NPC. Assim, ao somar essa força com a sua velocidade, ela será zerada, fazendo-o parar. O segundo caso é quando o NPC se encontra na “área de freio” (distância menor do que arrivalDistance). Nesse caso, aplique os cálculos descritos anteriormente. Por fim, se nenhum desses casos ocorrer, é porque o NPC precisa manter o comportamento Seek.
Parabéns!Você conseguiu ensinar dois comportamentos para os jogadores: ir em direção a um alvo e diminuir a velocidade quando ele estiver chegando nele. A partir desses comportamentos, você irá instruir os craques da bola que você criar a realizar manobras mais radicais na próxima aula! Até lá!
Versão 5.3 - Todos os Direitos reservados