Posição e direção de um evento vs player no mapa (RM MV)

8 Respostas   356 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Eliaquim

  • *
  • Posts: 481
  • Ouros: 287
  • Raze: The Rakuen Zero's Guardian!
  • Medalhas Participante do 'Amigo, Estou Aqui!'
Tópico criado em: 04/10/2018 às 21:19 - Última modificação por Corvo em 07/10/2018 às 16:19

Olá pessoal!
Estou aqui tentando quebrar a cabeça para fazer um sistema de batalha abs bem fuleiro por eventos.

Durante o processo, estou tentando determinar o seguinte: O inimigo(evento) só vai bater no player quando estiver virado de frente para o player. Se ele estiver de lado ou de costas para o player, mesmo que o jogador encoste no inimigo(evento), o evento não vai bater nele.

Sei que existe um script call que confere a direção do jogador
$gamePlayer._direction()     -    Down(2), Left(4), Right(6), Up(8) (que aliás, não consegui fazer funcionar =/)

Existe algum modo de eu checar a direção do evento?

Tentei me basear em um sistema de shooting por eventos que fizeram por aqui: https://centrorpg.com/index.php?topic=17174.0

Nesse sistema, quando o player está voltado para a direção do inimigo, (na mesma linha) você aperta o ok, e ele atira.
Para isso, o sistema pega as posições do player e do evento:
Spoiler
[close]

Eu gostaria de mudar essas condições dessas coordenadas de forma que diminuisse a distância. Porque assim, parece que ele só calcula a linha em que o evento e player está.
Gostaria de poder calcular por exemplo, se o player estiver 1 tile (1x ou 1y) a frente do evento, o player pudesse bater. Tem como fazer isso?

O meu maior problema é que apenas consigo fazer com que: Ou o player bata no evento. Ou o evento bata no player. Os dois ao mesmo tempo eu não consigo.

Alguma luz?






Corvo

Resposta 1: 05/10/2018 às 08:25

Para verificar a direção de um evento:

Código: [Selecionar]
$gameMap.event(this._eventId).direction()  // Comando chamado no próprio evento.
$gameMap.event(ID).direction()                 // Comando chamado em um terceiro evento.

Para a direção do jogador:

Código: [Selecionar]
$gamePlayer._direction()
Sobre a distância, vai entrar um pouco de matemática. Este tutorial foi feito pro Ace, mas a lógica é a mesma. Note como os mapas são, basicamente, tabelas. Para definir a distância dos ataques basta calcular uma área em redor do jogador. Por exemplo, ele pode alcançar até três tiles horizontais - ambos os lados - partindo do ponto onde está e dois tiles verticais - para cima e para baixo - também partindo do mesmo ponto.

[...]
O meu maior problema é que apenas consigo fazer com que: Ou o player bata no evento. Ou o evento bata no player. Os dois ao mesmo tempo eu não consigo.
[...]

Dependendo do modo como seus eventos fora estruturados, você pode definir a execução para Processo Paralelo. Assim a verificação de ambos será feita imediatamente, mas cuidado com bugs que poderão ocorrer. Inclua um tempo de espera entre os golpes ou, na primeira oportunidade, os inimigos irão travar o jogo atacando infinitamente.

Eliaquim

  • *
  • Posts: 481
  • Ouros: 287
  • Raze: The Rakuen Zero's Guardian!
  • Medalhas Participante do 'Amigo, Estou Aqui!'
Resposta 2: 05/10/2018 às 15:35

Opa! Valeu mais uma vez Corvo!

Então vou começar por partes, primeiro quero tentar fazer o lance da direção do evento.
Fiz assim, mas está dando erro.

Spoiler
[close]

Escrevi algo errado preenchendo o script? Até onde sei, as direções eu vejo pelo NumPad né?
UP - 8
DOWN - 2
RIGHT - 6
LEFT - 4

Corvo

Resposta 3: 05/10/2018 às 15:49

Sim. O comando $gameMap.event(this._eventId).direction() você vai usar se o comando for iniciado diretamente no evento que você quer saber a direção. Por isso o this.. Para usar em outros eventos use apenas o ID: $gameMap.event(1).direction(). As direções são números mesmos.

Eliaquim

  • *
  • Posts: 481
  • Ouros: 287
  • Raze: The Rakuen Zero's Guardian!
  • Medalhas Participante do 'Amigo, Estou Aqui!'
Resposta 4: 05/10/2018 às 17:46

Sim. O comando $gameMap.event(this._eventId).direction() você vai usar se o comando for iniciado diretamente no evento que você quer saber a direção. Por isso o this.. Para usar em outros eventos use apenas o ID: $gameMap.event(1).direction(). As direções são números mesmos.

Cara eu consegui fazer o ABS aqui legal. Não é perfeito como o dos plugins que tem por aí. Mas tá bem jogável.
A única coisa que não consegui fazer mesmo foi esse lance da direção.
Gostaria que fosse tipo assim.

Quando o evento tivesse virado para a direita e batesse no player, o player se movimentaria dois passos a direita.
Eu consegui fazer sem o lance da direção e dos passos. Fiz pelo tempo mesmo, o evento bate no player e até dar outra pancada tem um tempo.

Agora vou aprender esse lance das regiões que você colocou o tutorial. Daí com isso espero conseguir o seguinte:
- Os eventos vão se mover aleatóriamente. Quando o player chegar a uma determinada distância em tiles, ele vai ser perseguido pelo evento.
Obrigadão mesmo! Se ficar bom mesmo eu posto pra galera depois :)

Corvo

Resposta 5: 05/10/2018 às 17:50

Qual foi o problema com as direções? Nesse caso aí seria só verificar a direção do inimigo antes de mover o personagem, não? Por exemplo:

Código: [Selecionar]
> O Inimigo tocou no herói.
    > Se (direção do inimigo) = 2:
        Mover Herói (Direita) : 2
    > Se (direção do inimigo) = 3:
        [...]

Eliaquim

  • *
  • Posts: 481
  • Ouros: 287
  • Raze: The Rakuen Zero's Guardian!
  • Medalhas Participante do 'Amigo, Estou Aqui!'
Resposta 6: 05/10/2018 às 19:39

Qual foi o problema com as direções? Nesse caso aí seria só verificar a direção do inimigo antes de mover o personagem, não? Por exemplo:

Código: [Selecionar]
> O Inimigo tocou no herói.
    > Se (direção do inimigo) = 2:
        Mover Herói (Direita) : 2
    > Se (direção do inimigo) = 3:
        [...]

É eu tentei seguir essa lógica, mas no momento que o inimigo encosta, o herói vai pra no mínimo dois lados diferentes.
Isso que você escreveu foi usando o Conditional né?
Eu acho que teria um jeito, se eu pudesse usar o conditional junto com o movement route.
Ou pudesse executar essa opções através de script (Mover herói, mover evento, checar direção do herói e direção do evento)
Vou tentar ainda, mas estava fazendo outras coisas pra adiantar.
Talvez agora só domingo q eu vá ter tempo de mexer.

Corvo

Resposta 7: 05/10/2018 às 19:50

Sim. Na verdade esse processo é bem simples, dá pra fazer até por eventos se você não se incomodar em ocupar mais linhas. Por exemplo, supondo que um inimigo toque o herói de cima pra baixo temos:

Spoiler
[close]

Pras outras três direções só seria necessário criar outros três ifs. Essa parte não tem segredo. Ah, pra definir a direção de um evento para uma variável:

Código: [Selecionar]
Control Variables > Game Data > Character > This Event > Direction

Eliaquim

  • *
  • Posts: 481
  • Ouros: 287
  • Raze: The Rakuen Zero's Guardian!
  • Medalhas Participante do 'Amigo, Estou Aqui!'
Resposta 8: 07/10/2018 às 16:17

....

Pow cara deu certo!
Eu estava fazendo usando o comando do script assim:
$gameMap.event(this._eventId).direction(2)
Colocando o 2 dentro dos parênteses.
Agora armazenei o script em uma variável, e fiz conforme o seu evento, IF enemy dir = 2
Funcionou aqui! Vou testar mais algumas coisas e futuramente devo criar um post com esse sistema de evento pro pessoal usar ou remodelar sei lá.
Valeu mesmo!