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

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

Iniciado por Eliaquim, 04/10/2018 às 21: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?






Para verificar a direção de um evento:

$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:

$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.

Citação de: Eliaquim online 04/10/2018 às 21:19
[...]
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.

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

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.

Citação de: Corvo online 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.

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 :)

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:

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

Citação de: Corvo online 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:

> 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.

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:

Control Variables > Game Data > Character > This Event > Direction



Citação de: Corvo online 05/10/2018 às 19:50
....

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!