O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Detecção de Posicionamento e Distância de Eventos - Parte 3

Iniciado por anticasper, 20/07/2014 às 14:36

Introdução

Salve Galera!

A terceira parte do tutorial de Detecção de Posicionamento e Distância de Eventos chega um pouco mais tarde porque essa deu um pouco de trabalho. Cuidaremos agora da detecção em cone, uma forma mais eficiente de simular a visão em 2D.

Para vias de seguir, sugiro a leitura das duas primeiras partes do tutorial:

Parte 1
Parte 2




Detecção de Posicionamento e Distância de Eventos

Na terceira parte do tutorial trabalharemos a detecção em cone:



Olhando mais de perto, vamos analizar como a detecção deve proceder.



Observe que a area de detecção aumenta enquanto a distância também aumenta. Como trabalhamos com tiles, é muito fácil perceber que a cada um tile que aumenta em x, outros dois aumentam em y. Podemos começar a criar nosso método de detecção.

Lá no Game Interpreter, onde trabalhamos nos dois tutoriais anteriores, criamos um novo método:



Explicando detalhadamente alguns pontos do código.

# Variável para controle Retorno
    ret = false


Usaremos essa variável para retornar para o evento solicitante se foi detectável ou não. Quando o evento detectar o herói, essa variável se torna verdadeira.

   
    # Fazer o range de distancia máxima
    yi = evento.y
    yf = evento.y
    xf = evento.x
    xi = evento.x   


Criamos aqui os limites das áreas de detecção. Inicialmente pegamos as posições x e y como limites e aumentaremos esse range a partir do laço que segue. Vamos entender essa lógica:



Observe que precisamos criar laços de repetição. Observe também que precisamos fazer não um, mas dois laços. Um que varra a posição X e outro que varra a posição Y. Também é preciso observar que a variavel de limite yi e yf aumentam, enquanto o laço de x é fixo e limitado pelo range.

Programando:



Note que temos um laço dentro de outro. Note também que os limites do segundo laço são variaveis e a cada laço de x, as variáveis de y variam em 1.

Também crio um array chamado bloq cuja função é criar as áreas de bloqueio. O bloqueio funciona ignorando as linhas as quais o herói esteja atrás de algum bloqueio. A ideia desse array é armazenar todos os Ys que estejam bloqueados.



Em código:



Também crio uma outra função para detectar se o player está na posição informada:



Explicando o código final.

Primeiro, verifico se existe algum bloqueio, se sim, adiciono o y como bloqueado:

            if !$game_map.passable?(x, y, 6)
              bloq.push(y)
            end


Depois, verifico se o player está na posição solicitada e se não está num Y bloqueado:

# Checa se o player está na posição
            if player_ta_ai(x,y) && !bloq.include?(y)
              ret = true
            end


Se as duas checagens forem validadas, meu retorno para o evento será verdadeiro, dizendo que o player foi detectado.

Isso funciona porque a sequência em que os quadros são vistos favorece:



Para testar o sistema funcionando, vamos criar um evento teste:



E o sistema ficaria assim:



Finalizo então minha difícil detecção em cone :)

No tutorial final, a detecção atrás do evento e alguns bônus. Nos materiais, coloco as detecções nas demais posições.




Materiais

Link para o Código
Link para download do Projeto.




Até a próxima!