🤔 Para Refletir :
"Mudar não é fraqueza, pelo contrário, é um sinônimo de superação"
- Ricky O Bardo

Linha de visão dos guardas

[Cronos]

Plebeu
Membro
Membro
Juntou-se
12 de Janeiro de 2017
Postagens
29
Bravecoins
11
Olá!

Estou tentando fazer um daqueles puzzles onde o jogador precisa passar por um local cheio de guardas sem ser visto.

Eu fiz da seguinte forma: no evento do guarda, programei para ele se virar de três em três segundos (180 frames), sendo que quando ele está de frente um switch é ativado e os eventos que formam sua linha de visão aparecem, mostrando a tela de Game Over se o jogador estiver num deles.

Acontece que não estou conseguindo programar a linha de visão corretamente. Quando ela está ativa, se o jogador andar num dos eventos que a formam o Game Over aparece. No entanto, se o jogador já estiver na linha de visão quando o guarda se virar, mas em vez de andar ficar parado, nada acontece. Eu gostaria de saber como resolvo isso, pois também quero que o game over apareça se o jogador estiver parado dentro da área da linha de visão do guarda.

Obrigado!

Obs.: em anexo, a forma como estou programando o evento.
 

Anexos

  • Linha de Visão.png
    Linha de Visão.png
    22,6 KB · Visualizações: 55
Pode mostrar mais detalhes pra entender melhor a situação, uma print do evento inteiro, do guarda também e da tela inteira pra eu tentar simular algo aqui pra você, tipo se esta abaixo do herói em teoria era pra ele passar normal por cima, já verificou todos eventos da linha se possui algum de forma diferente ou se no guarda colocou um aguarda a conclusão... esse aguardar a conclusão que pode esta bugando...

Aguardo uma resposta caso tenha funcionado, caso não as prints pra simular algo.
 
É um erro comum colocar o evento mudando entre duas páginas e uma delas ser ativada no toque do personagem, daí quando o personagem já estava em cima do evento na primeira página, assim que o evento passa para a segunda página ele não conta como se o herói tivesse encostado no evento. No MV e no XP isso fica muito mais fácil de se fazer, por causa da ferramenta de terreno, mas no VX ou Ace (não sei qual você tá usando) fica bem mais complicado do que você tá fazendo.

Vai valer mais a pena você colocar os guardas girando e esquecer os eventos que ficam no chão fazendo dar gameover (apagar eles mesmo). Você teria que colocar um evento em paralelo que guarda o X e o Y do personagem em duas variáveis, depois você teria que verificar se o personagem está em algum lugar que é o campo de visão de algum guarda naquele momento. Vai ficar cheio de IF's, infelizmente. Se você souber scripts e um pouco de gráficos ou geometria, vai facilitar bastante.

Se fosse no MV bastaria colocar um múltiplo de números primos como terreno no chão e verificar se o número do terreno que o personagem está pisando é divisível pelo número primo da vez (tipo, os guardas fazem 4 movimentos diferentes, então você usa 2, 3, 5 e 7 como base pra marcar para onde eles estão olhando). Essa explicação ficou meio confusa, mas whatever, você tá usando Ace eu acho.
 
Obrigado por responder. Mais detalhes em anexo. Acho que é mais ou menos como a Pessoa disse. Isso tem solução?
 

Anexos

  • Linha de Visão.png
    Linha de Visão.png
    416,6 KB · Visualizações: 54
  • Problema.png
    Problema.png
    560,1 KB · Visualizações: 54
Boa tarde, como falei simulei aqui algumas soluções que ao meu ver funcionaram bem sem script, mais ficaria mil vezes melhor com o uso de script de calcular áreas...

Fiz assim um evento guarda com "mover evento" olhar pra direita esquerda baixo cima. if direção este evento baixo...esquerda...direita...cima...(ocorre game over se "variavel" player_x ou y estiver em posição x ou y do guarda += 1..5)
Isso faz que sempre que o personagem passar na frente do guarda olhando pra ele dentro dos quadros de 1 a 5 após ele ocorra gameover!

tente simular essa ai e me diz se conseguiu, mais é como Pessoa falou : vai usar muitos IFs e Variaveis!

EDIT:
Você postou a sua resposta enquanto eu escrevia a minha e enviei kkk
bom, achei simples!
Já mando uma resposta pra você.

 
Você respondeu enquanto eu editava minha mensagem. x-x' Vou colocar uma nova mensagem para caso queira responder não postar duas vezes seguidas.

wjR7v.png

Acabei de descobrir que o Ace tem sim ferramenta de terrenos, então vou explicar melhor o que pensei no MV. Em passos:

1. Guarde quantos turnos os guardas tem, por exemplo (com 4 guardas):
  - No primeiro turno todos os guardas olham para cima
  - No segundo dois deles olham para os lados
  - No terceiro os outros dois olham para baixo
  - No quarto eles olham um para o outro
  - Não tem quinto turno, ele volta para o primeiro turno e os guardas ficam nesse loop

2. Agora que você sabe que os guardas possuem 4 turnos, vamos marcar que cada turno vai ter um número primo. O primeiro turno tem o número 2, o segundo o número 3, o terceiro o número 5 e o quarto o número 7.

3. Agora use a ferramenta de terreno para marcar o chão. Marque todos os lugares que o personagem NÃO pode estar no primeiro turno com o número 2. Agora faça isso com o segundo turno usando o número 3 e assim em diante. Caso você precise cruzar a visão de dois turnos diferentes, no lugar onde eles se encontram coloque o produto dos dois primos. Por exemplo, se em um determinado quadrado tem um guarda olhando no turno 1 e outro guarda olhando no turno 2, você precisa colocar ali o terreno de número 2 * 3 que é 6. Infelizmente você não vai poder passar do número 63.

4. Agora crie um evento em paralelo, de alguma forma esse evento precisa encontrar o número do terreno que o personagem está pisando e ele precisa saber qual é o turno corrente. Então ele vai pegar o resto (ou o mod) da divisão do terreno que o personagem está pisando pelo número do turno. Por exemplo, se for o turno 3 (que tem o primo 5) então você vai pegar o terreno do personagem (terreno 2, por exemplo) e vai pegar o resto da divisão ( 5 / 2 = 0 e sobra 2 ). Você tem que verificar se o resto deu 0, se sim então é game over.

Espero que tenha entendido.
 
Bom, pensei aqui, acho que achei sua solução de forma mais simples, vou te manda o projeto e você me diz se ficou do jeito que você precisa... e usa pra estudo caso ache legal!

aqui o link do projeto demo que fiz pra você!

https://www.dropbox.com/s/buvau5938s8tw8c/Project1.exe?dl=0

Estou aguardando respostas Ok?!
 
Obrigado por me ajudarem, Pessoa e Julio. Vou testar as soluções de vocês mais tarde e digo aqui os resultados!

Edit:

Julio, seu Demo tem exatamente o mesmo problema do meu sistema. Quando você entra no campo de visão enquanto com os guardas estão de costas e então para de andar, o game over não ativa quando eles viram. Mais tarde irei testar a solução da Pessoa. Mas obrigado mesmo assim!

Edit 2:

Pessoa, sua sugestão funcionou!

Eu usei 3 variáveis e 2 eventos paralelos (mais 1 para cada guarda):

Variável 1 = posição x do personagem, que fica sendo atualizada mediante um evento paralelo
Variável 2 = posição y do personagem, que fica sendo atualizada mediante um evento paralelo
Variável 3 = ID da região do mapa onde o evento das variáveis 1 e 2 (no caso, o personagem) está no momento

Evento 1 = armazena as coordenadas x e y do personagem nas variáveis 1 e 2
Evento 2 = armazena o ID da região do mapa onde o personagem está na variável 3
Eventos X = um para cada guarda, de modo que quando o switch que determina se o guarda está de costas está desativado, a tela de game over é mostrada caso a variável 3 seja igual ao valor que eu especifico que, no caso, é o ID da região onde ele não pode estar

Em resumo, foi isso.

Obrigado aos dois!
 

Anexos

  • Linha 2.png
    Linha 2.png
    158,8 KB · Visualizações: 41
Bom, você que que de game over com o personagem parado nas costas  dos guardas também?
ai complica... deixa eu ver se acho uma solução pra dar game over com ele parado aqui...
mais acho que isso só por script que você vai consegui... eu acho!
 
JulioRPGCriator comentou:
Bom, você que que de game over com o personagem parado nas costas  dos guardas também?
ai complica... deixa eu ver se acho uma solução pra dar game over com ele parado aqui...
mais acho que isso só por script que você vai consegui... eu acho!

Não, Julio, não é isso. Eu já resolvi o problema com a sugestão da Pessoa, mas o que acontecia era o seguinte:

1. Guardas estão de frente.
2. Guardas viram de costas.
3. Jogador entra no campo de visão dos guardas e fica parado nele.
4. Guardas viram de frente novamente e o jogador ainda está no campo de visão, só que parado.
5. Game over não aparece, mesmo que, visualmente, os guardas estejam olhando direto para o jogador.
 
Olá, desculpem me intrometer na dúvida alheia, porém estou passando por um problema semelhante.

[member=1518]Pessoa[/member] você poderia explicar melhor esse seu método pelo número dos tiles? Até o passo 3 eu entendi o raciocínio, porém me perdi no ultimo passo. Como encontrar o número do tile que o jogador está? e sobre a integração entre essas variáveis, poderia detalhar melhor o procedimento? Por fim, como fazer esse cálculo para saber se o produto da equação é zero ou não?

Estou usando o RPG Maker MV, mas pode explicar como seria esse procedimento no RPG Maker VX Ace para não tumultuar e desvirtuar o tópico de dúvida do @Cronos
 
Aaaah entendi o problema cara, nossa você deve esta me xingando de burro ai!
kkkkkkkkkkkkkkkkkkkkkk
Aqui pega a demo corrigida e me perdoe pela bobeira!

https://www.dropbox.com/s/buvau5938s8tw8c/Project1.exe?dl=0

Respondendo o Dobberman:

eu verifiquei se conseguia fazer da forma do Pessoa aqui no VX Ace e só identifiquei a opção de uso dos titles para batalhas, se tiver no 2 chama tal mostro 4 tal e isso... só se tiver alguma forma que eu desconheço...

mais o Cromos conseguiu usar, seria legal se ele mostrasse pra eu ter conhecimento de como é >  <
 
JulioRPGCriator comentou:
Aaaah entendi o problema cara, nossa você deve esta me xingando de burro ai!
kkkkkkkkkkkkkkkkkkkkkk
Aqui pega a demo corrigida e me perdoe pela bobeira!

https://www.dropbox.com/s/buvau5938s8tw8c/Project1.exe?dl=0

Respondendo o Dobberman:

eu verifiquei se conseguia fazer da forma do Pessoa aqui no VX Ace e só identifiquei a opção de uso dos titles para batalhas, se tiver no 2 chama tal mostro 4 tal e isso... só se tiver alguma forma que eu desconheço...


De boas, valeu pela ajuda! Dessa vez funcionou e esse método é bem mais simples de fazer.
 
Dobberman comentou:
[member=1518]Pessoa[/member] você poderia explicar melhor esse seu método pelo número dos tiles? Até o passo 3 eu entendi o raciocínio, porém me perdi no ultimo passo. Como encontrar o número do tile que o jogador está? e sobre a integração entre essas variáveis, poderia detalhar melhor o procedimento? Por fim, como fazer esse cálculo para saber se o produto da equação é zero ou não?

Então, aparentemente o Cronos fez meio diferente de mim. Vou colocar aqui exatamente o que eu fiz usando um projeto antigo que eu implementei isso:

Esse daqui é o meu mapa:
rJjmCpE.png


Os guardas ficam assim:

evento do guarda:
xBG01VZ.png


evento comum que muda os turnos:
MxeFLWB.png

Eles simplesmente tem 4 páginas, poderia ter feito com uma, mas fiz 4. Ter feito 4 páginas me ajuda a saber em qual turno o sistema está. O nome do evento foi pra me ajudar a organizar, ele diz quais são os lugares para onde o guarda vai olhar.


O evento que checa se o jogador está sendo visto por um dos guardas é esse:

6ju1V0o.png

Ele pega o ID do terreno (podia ter usado uma variável a menos aí), então ele divide o número do terreno pelo número primo que pertence ao turno. Inicialmente o primeiro turno era o número "primo" 1, então eu percebi a besteira que fiz e troquei por 7. A pergunta que você fez sobre como fazer a conta está muito sem sentido, não tem como eu responder exatamente, mas acho que era disso que estava falando.


Por fim, os terrenos do jogo ficaram assim:

Va7wmY7.png


Todos os campos divisíveis por 7 são os campos que os guardas estarão olhando no turno 1, todos os divisíveis por 2 no turno 2, todos os divisíveis por 3 no turno 3 e todos os divisíveis por 5 no turno 4. Sendo assim, o evento comum ali de cima vai dividir o terreno pelo número primo do turno e o resto só vai ser 0 se esse número for divisível pelo primo do turno. Cada guarda vê até 7 blocos de distância. Ignore o número 11, podia ser 1 também ou qualquer outro número primo.


Esse meu jeito de fazer é bom para caso você queira colocar vários guardas no mesmo mapa, você só precisa configurar um único evento pra virar os guardas, outro para checar o terreno do jogador e o resto é basicamente mapeamento. Eu acho chato e demorado ter que ficar configurando guarda por guarda. Eu coloquei ele em eventos comuns para o caso de querer usar mais tarde no projeto, assim seria apenas mapear tudo de novo e ligar a switch certa.
 
Pessoa comentou:
Ele pega o ID do terreno (podia ter usado uma variável a menos aí), então ele divide o número do terreno pelo número primo que pertence ao turno. Inicialmente o primeiro turno era o número "primo" 1, então eu percebi a besteira que fiz e troquei por 7. A pergunta que você fez sobre como fazer a conta está muito sem sentido, não tem como eu responder exatamente, mas acho que era disso que estava falando.

[member=1518]Pessoa[/member] muito obrigado pelo tempo dedicado nessa resposta, foi realmente esclarecedora.

Minha dúvida era como dividir o número e guardar o "resto" na variável. As imagens que você postou responderam perfeitamente a minha pergunta, muito obrigado pela presteza e esclarecimento.
 
Voltar
Topo Inferior