Descoberta de caminhos com linha de visão

2

Tagged

Contributors

Stats

9,722 visits, 10,535 views

Tools

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Published on 12 Jun, 2013. Last updated 25 Feb, 2019

Introdução

Olá a todos!

Eu vou mostrar para você como combinar o comportamento Pathfinding (Descoberta de caminhos) com um sistema de linha de visão entre os inimigos que têm algum AI básica e o player, pois eles vão passear quando não estiverem alertas, e uma vez que eles tenham a linha de visão do jogador, irão persegui-lo . Se a linha de visão for quebrada por um tempo suficiente, eles vão voltar ao seu estado errante. Este tutorial é feito para um jogo isométrico, mas também pode ser aplicado em jogos de cima para baixo, e outras variedades imensas.

Você pode pegar como exemplo o .capx aqui

Criando nossos comportamentos

Tudo bem, nós iremos precisar de algumas coisas antes de começar a implementar os eventos. Nós precisaremos de:

* Uma imagem de inimigo;

* Uma imagem de Player;

* Uma imagem para a linha de visão;

* Algumas imagens para o cenário (paredes, piso, portas);

* Uma imagem extra que ajudará o inimigo a descobrir caminhos enquanto sem ficar preso enquanto está se movendo;

* Dois icones, um para represetar o inimigo alerta, outro para quando ele tiver linha de visão para o player;

Você pode criar as imagens que quiser, do tamanho que quiser, mas para facilitar, criei o meu no editor do próprio Construct 2. Abaixo um exemplo de como ficaram (Estou estabelecendo o tamanho de 32x32 pixels para melhorar o enquadramento nas grades).

Da esquerda para a direita estão: piso, áreas bloqueadas (espaços dentro de paredes), painéis de paredes, porta.

E aqui está como as utilizei:

Para o icone de estado, deixei ele simples:

Para as imagens do player e inimigos, fiz eles com 24x48 pixels para este exemplo (É uma boa ideia fazer seus personagens menores que a abertura das portas, caso contrário eles poderão emperrar):

Agora, a imagem do inimigo precisará de alguns pontos de ancoragem, para o icone de estado e para a linha de visão. O ponto de origem do inimigo precisará ser mais ou menos a 1/3 da altura da imagem (ficando mais perto dos pés dele). Isto fará com que a imagem não fique flutuando sobre paredes de maneira não realista. Os pontos alertPoint e losPoint são para ancorar o icone de estado. O ponto eyes é para a linha de visão. Coloquei bem perto de onde os olhos do inimigo ficariam, para parecer real:

Para a imagem da linha de visão, você precisará criar algo com tamanho de 1x1 pixels, pois esta imagem será esticada para formar uma linha entre o player e o inimigo. Tenha certeza de que você atribuiu o ponto de origem da linha de visão no canto inferior esquerdo da imagem, ou experimentará comportamentos estranhos:

Não esqueça que o nome das imagens deve ser bem descritiva, pois isto irá ajudar imensamente quando estiver fazendo eventos e achando bugs.

Vamos começar!

Certo, então nós criamos as imagens. Elas parecem fantásticas, mas não fazem nada ainda.

O jogador

Primeiro de tudo, dê ao jogador o comportamento de '8 direções' (8 Direction), e defina os valores como mostrado aqui:

Depois, dê às imagens unwalkable area e door o comportamento de 'Sólido' (Solid). Isto é puramente para fazer os objetos serem intransponíveis. A imagem do inimigo irá usar um método diferente para dizer a ele onde ele poderá andar ou não. A reação para isto será incluir um obstáculo adicional que não é um sólido (aquele imagem extra):

Se você rodar o layout agora, verá que é possível mover seu personagem. Fabuloso! Mas quando ele colide com a porta, nada acontece, então vamos cuidar disso agora.

Mergulhando dentro da folha de eventos do layout e seguindo abaixo:

Nossa! agora quando ele colide com a porta, ela desaparecerá e o player poderá continuar andando.

O inimigo

Aqui é onde as coisas ficam complicadas, mas com certeza nós cuidaremos disso, não se preocupe.

Dê a imagem do inimigo o comportamento de "Descobrir caminhos" (Pathfinding) e dê as seguintes configurações:

Depois de terminar, faça do inimigo um recipiente (container) com a seguintes imagens dentro dele:

Com esta configuração, nós iremos trabalhar primeiro com a rotina de deslocamento do inimigo. Isto é simples de fazer, como tudo o que realmente precisa é do comportamento de procurar caminhos (pathfinding), escolher um ponto aleatório no layout e ver se ele pode se mover até lá.

Se ele puder, ele irá se mover até o ponto, senão, irá procurar outro ponto que possa se mover. Como pré requisito para o que nós faremos depois, dê ao inimigo a seguinte instância variável (Irei explicar melhor depois, neste tutorial):

Volte a folha de eventos e crie os seguintes eventos:

Isto dirá ao inimigo que ele não pode andar sobre/por dentro de paredes e portas, ou ele seria um fantasma.

Isto configura os eventos para dizer ao inimigo o que fazer quando ele não está alerta (exemplo: vagando).

Se você rodar o cenário agora, seu inimigo irá vagar envolta sem rumo, evitando obstáculos e ignorando completamente o jogador.

Se você colocar salas dentro do cenário, o jogador abrir a porta em algumas delas, o inimigo não irá se mover dentro de salas recém abertas. Isto é devido ao inimigo necessitar reconstruir os obstáculos no mapa.

Você precisa rodar este evento de reconstrução toda vez que uma porta for aberta:

Agora seus inimigos receberão um update toda vez que uma porta for aberta, e poderão se mover mais lucidamente ao redor do ambiente.

Esta parte é completamente opcional, mas eu gostaria de recomendar que você considere o princípio, por ele ter se provado muito competente como solução de problemas como inimigos cortando cantos sobrepondo obstáculos que não deveriam.

Através do uso de imagens invisíveis de ajuda, você pode facilmente mudar rotas específicas que os inimigos podem fazer. Isto age previnindo que o inimigo sobrescreva obstáculos:

Meus objetos de ajuda são verdes, e podem ficar visíveis e invisíveis quando pressionando H no arquivo de exemplo ".CAPX".

Linha de visão

Agora para o verdadeiro conteúdo!

Básico

Para nosso motor de linha de visão, precisaremos anexar a imagem de linha de visão em um dos 'olhos' (eyes) do inimigo e esticar (stretch) ela até o player.X e Y.

Quando a imagem não colidir com um obstáculo, então o inimigo terá linha de visão (hasLineOfSight) e seu valor booleano será verdadeiro, e, ele irá perseguir o player.

Quando o inimigo perder a linha de visão, um tempo de espera será iniciado, e uma vez que o tempo tenha passado, o inimigo irá parar de seguir e voltará a vagar pelo cenário.

O motivo para ter incluído este tempo de espera é prevenir que o inimigo pare imediatamente depois de perder a linha de visão, ao invés disso, ele perseguirá o jogador por alguns segundos a mais antes de desistir.

Vamos fazer isto! Para a primeira sessão (configurando a linha de visão, crie os seguintes eventos:

O primeiro evento irá apagar nossa instancia mestre da linha de visão.

Dica Pro: Construct 2 requer ao menos uma instancia (um objeto) daquilo que você irá criar na tela disposto no cenário. Então, tenha certeza de ter criado ao menos uma imagem do objeto no cenário para que possamos usa-la no jogo. Você pode usar a área fora do cenário e dentro das margens, para que estes objetos fiquem escondidos.

O segundo bloco de eventos conseguiu ficar assim:

Fantástico! Agora nós termos a linha de visão anexada aos nossos inimigos, e eles traçam a linha entre você e eles!

Configurando os estados

Agora nós iremos definir o que acontece com os inimigos que não têm linha de visão com o player:

Neste evento, se a linha de visão está sobrepondo qualquer obstáculo, então a instancia hasLineOfSight booleana do inimigo será falsa e o inimigo não está atualizando seu status de 'alerta'. Assim, quando não há nenhum obstáculo entre eles, hasLineOfSight é verdadeira e alertCooldown é configurado para 5 (pensando que ele continuará perseguindo o player e atualizando seu alerta, e quando o mesmo perder a linha de visão, continuará por mais 5 segundos).

Estes estados booleanos são necessários, pois eles nos permitem controlar as ações dos inimigos baseados na linha de visão ou não, e o que acontece quando eles estão alertas ou não.

Com isto em mente, nós iremos dizer ao inimigo o que fazer quando o estado 'alerta' for verdadeiro:

Para melhorar, combine os dois blocos de eventos "Enemy is Alerted; Every 1 Second".

Com isto terminado, quando você rodar o cenário, agora seus inimigos irão te perseguir enquanto eles tiverem linha de visão, e caso a percam, irão perseguir por mais 5 segundos.

Icone de estado

Por fim, nós criamos o icone de estado para mostrar quando o inimigo está alerta:

Isto irá mostrar dinamicamente se o inimigo está ou não alerta:

Este inimigo está alerta e com linha de visão:

Este inimigo está alerta, mas não têm linha de visão.

Concluindo

Espero que este tutorial tenha se provado útil, pois me tomou alguns dias para ter tudo funcionando igual eu queria.

Com os estados booleanos, você poderá fazer facilmente com que um inimigo ataque assim que tiver linha de visão, igual no exemplo example .CAPX incluso neste tutorial.

Se você for além e achar alguma inconsistência neste tutorial, ou precisa de alguma explicação mais detalhada, comente aqui ou envie um PM em inglês para o autor original.

Autor Original: Wrangler

Tradutor: Telles0808

Nota: Esta é uma tradução livre, fatos e fatores podem ter sido mudados para melhor compreensão, caso discorde de algum ponto aqui mencionado, em relação ao tutorial original, por favor, mande um PM para que possa ser melhorado.

Se você tiver qualquer dúvida e necessitar de ajuda, entre em nossa Comunidade Oficial Brasileira, que é afiliada da Scirra e faça um tópico ou utilize nosso shoutbox:

Endereço: igmbrasil.com

.png]

  • 0 Comments

Want to leave a comment? Login or Register an account!