Tutorial: Diálogo e Banco de Frases

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial: Diálogo e Banco de Frases

Mensagem por Willy em Qui 24 Abr 2014, 00:35

Tutorial: Diálogo e Banco de Frases

Quem já viu a engine Movimento Limpo, viu que eu criei um sistema de diálogo entre o NPC e o jogador. Apesar do foco da engine ser outro, algumas pessoas gostaram do sistema mas não entenderam muito por estar pouco comentado e com nomes de variáveis pouco intuitivos, sem falar na tremenda gambiarra que foi feito ali. Atendendo a pedidos, por fim, estou a disponibilizar para vocês um tutorial especifico para esclarecer como o sistema foi feito e como se deve usar. O tutorial não tratará de formatação alguma, apenas da lógica do sistema, ou seja, a forma de executar o sistema fica exclusivamente por sua conta. Sem mais, vamos começar!

Dificuldade: Fácil - Necessário entender Arrays 2D
Plataforma: Todas

Para usarmos de exemplo, usasrei a letra da música "Monte Castelo", da banda "Legião Urbana", uma das bandas que mais gosto e que muitos conhecem.

Monte Castelo - Legião Urbana:
Ainda que eu falasse a língua dos homens
e falasse a língua dos anjos, sem amor eu nada seria.

É só o amor, é só o amor;
Que conhece o que é verdade;
O amor é bom, não quer o mal;
Não sente inveja ou se envaidece.

O amor é o fogo que arde sem se ver;
É ferida que dói e não se sente;
É um contentamento descontente;
É dor que desatina sem doer.

Ainda que eu falasse a língua dos homens
e falasse a língua dos anjos, sem amor eu nada seria.

É um não querer mais que bem querer;
É solitário andar por entre a gente;
É um não contentar-se de contente;
É cuidar que se ganha em se perder;

É um estar-se preso por vontade;
É servir a quem vence, o vencedor;
É um ter com quem nos mata a lealdade;
Tão contrario a si é o mesmo amor.

Estou acordado e todos dormem todos dormem, todos dormem;
Agora vejo em parte, mas então veremos face a face.

É só o amor, é só o amor;
Que conhece o que é verdade.

Ainda que eu falasse a língua dos homens
e falasse a língua dos anjos, sem amor eu nada seria.
Esta música será uma conversa qualquer entre o NPC e o jogador. O NPC só falará uma estrofe inteira linha por linha por vez , ou seja, se quisermos saber a música toda, deveremos falar com o NPC várias vezes.

Certo, isso já é o suficiente, agora podemos partir para a programação. Crie um objeto qualquer, declararemos três variáveis em um creation code no evento create:

Código:
Estrofes = 8;
Dialogo = 0;
Frase = 1;

Estrofes representa a quantidade de diálogos que o NPC tem, Diálogo representa a estrofe, e Frase a linha da estrofe.
Essas duas ultimas variáveis serão nossas guias, e são elas que decidirão qual frase deverá ser mostrado na tela.
Nota: O valor de Estofes é a quantidade total de estrofes que o NPC tem, portanto, pode variar para qualquer valor. As outras duas variáveis devem ter obrigatoriamente aqueles valores. Mais adiante você saberá o porquê.

Ainda no create, crie um outro creation code abaixo deste anterior (ou se preferir, pode ser no mesmo creation code). Este será o nosso banco de frases! Nosso banco terá apenas Arrays 2D para armazenar as frases na ordem que elas deverão aparecer. Chamaremos essa array de Texto. A primeira dimensão representa o Dialogo que a frase pertence, e a segunda dimensão, a frase do dialogo. Ou seja: Texto[Dialogo, Frase];
Pegando a primeira estrofe, o texto deveria ficar assim:

Código:
Texto[0,0] = "Ainda que eu falasse a língua dos homens"
Texto[0,1] = "e falasse a língua dos anjos, sem amor eu nada seria."

A principio, está correto. Mas, precisaremos adicionar mais uma array:

Código:
Texto[0,0] = 2;
Texto[0,1] = "Ainda que eu falasse a língua dos homens"
Texto[0,2] = "e falasse a língua dos anjos, sem amor eu nada seria."

Para o sistema funcionar, todo Texto[Dialogo,0] deverá ter um numero (real, e não string) que representa a quantidade de frases que a estrofe tem, que neste caso, é 2.

Veja como deve ficar a música toda:

Código:
///Banco de Diálogos
Texto[0,0] = 2;
Texto[0,1] = "Ainda que eu falasse a língua dos homens"
Texto[0,2] = "e falasse a língua dos anjos, sem amor eu nada seria."

Texto[1,0] = 4;
Texto[1,1] = "É só o amor, é só o amor;"
Texto[1,2] = "Que conhece o que é verdade;"
Texto[1,3] = "O amor é bom, não quer o mal;"
Texto[1,4] = "Não sente inveja ou se envaidece."

Texto[2,0] = 4;
Texto[2,1] = "O amor é o fogo que arde sem se ver;"
Texto[2,2] = "É ferida que dói e não se sente;"
Texto[2,3] = "É um contentamento descontente;"
Texto[2,4] = "É dor que desatina sem doer."

Texto[3,0] = 2;
Texto[3,1] = "Ainda que eu falasse a língua dos homens"
Texto[3,2] = "e falasse a língua dos anjos, sem amor eu nada seria."

Texto[4,0] = 4;
Texto[4,1] = "É um não querer mais que bem querer;"
Texto[4,2] = "É solitário andar por entre a gente;"
Texto[4,3] = "É um não contentar-se de contente;"
Texto[4,4] = "É cuidar que se ganha em se perder;"

Texto[5,0] = 4;
Texto[5,1] = "É um estar-se preso por vontade;"
Texto[5,2] = "É servir a quem vence, o vencedor;"
Texto[5,3] = "É um ter com quem nos mata a lealdade;"
Texto[5,4] = "Tão contrario a si é o mesmo amor."

Texto[6,0] = 2;
Texto[6,1] = "Estou acordado e todos dormem todos dormem, todos dormem;"
Texto[6,2] = "Agora vejo em parte, mas então veremos face a face."

Texto[7,0] = 2;
Texto[7,1] = "É só o amor, é só o amor;"
Texto[7,2] = "Que conhece o que é verdade."

Texto[8,0] = 2;
Texto[8,1] = "Ainda que eu falasse a língua dos homens"
Texto[8,2] = "e falasse a língua dos anjos, sem amor eu nada seria"

Repare que a primeira estrofe é representada por "0". Isso justifica o motivo da variável "Dialogo" começar valendo 0. Repare também que em todas as estrofes, a primeira frase é representada sempre em Texto[Dialogo,1], o que justifica o motivo de "Frase" começar valendo 1. 

Nosso banco de frases já está pronto! Agora, tudo que precisamos fazer é criar um sistema para "navegarmos" por estas frases, vendo em prática como tudo funciona! Mas primeiro, crie uma nova fonte e configure-a para ASCII para que todos os caracteres possam ser desenhados (chamarei de fnt_ascii). Depois, defina a fonte e mande desenhar a frase no evento Draw da seguinte forma:

Código:
///Desenha a frase na tela.
draw_set_font(fnt_ascii);
draw_text(16,16,Texto[Dialogo,Frase]);

Coloque o objeto na room e execute o projeto. Veja que legal, a primeira frase está na tela! Mas, e agora?
Precisamos montar um sistema para navegar entre as frases da estrofe. Algo como isso, no step:

Código:
if keyboard_check_pressed(vk_space){
    if (Frase < Texto[Dialogo,0]){ //REPARE!
        Frase += 1; //Avança para a próxima frase do dialogo.
    }
}
Repare! Estou comparando "Frase" com o valor de Texto[Dialogo,0], dessa forma impedimos que o navegador vá para uma frase que não existe! Foi por esse motivo que eu disse:

Willy escreveu:Para o sistema funcionar, todo Texto[Dialogo,0] deverá ter um numero (real, e não string) que representa a quantidade de frases que a estrofe tem[...]

Execute. Agora, sempre que você apertar espaço, a frase vai trocar... Mas espere.. Por que não está indo a música toda?
Porque ainda não configuramos para trocar de dialogo (estrofe) quando as frases acabarem! Portanto, devemos adicionar um else para quando as frases acabarem, ficando da seguinte forma:

Código:
if keyboard_check_pressed(vk_space){
    if (Frase < Texto[Dialogo,0]){
        Frase += 1;
    }else if (Dialogo < Estrofes){
        Frase = 1; //Volta para a primeira frase.
        Dialogo += 1; //Avança pro próximo diálogo. 
    }
}

Execute e veja. Agora sim, todo o texto está sendo mostrado.
Este sistema nada mais é do que bolar uma forma inteligente de navegar por entre as frases. Se você quiser fazer uma quest, por exemplo, poderá querer colocar condições para avançar de estrofe, como por exemplo, ter coletado 20 moedas como pagamento para uma informação. Use a criatividade e muita lógica!

Isto encerra nosso tutorial! Espero que tenham gostado.
Dúvidas, críticas ou sugestões são bem-vindas! 

Download Exemplo.gmz

Flws... blz

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tutorial: Diálogo e Banco de Frases

Mensagem por G_STF em Qui 24 Abr 2014, 09:17

Estive a testar e deu certinho, depois eu tentei fazer com que só
fosse possível surgir o diálogo ao chegar perto de um outro objeto.
Então para isso coloquei na colisão com o objeto o código:
Código:

if keyboard_check_pressed(vk_space){
    if (Frase < Texto[Dialogo,0]){
        Frase += 1;
    }else if (Dialogo < Estrofes){
        Frase = 1; //Volta para a primeira frase.
        Dialogo += 1; //Avança pro próximo diálogo.
    }
}

Pelo que só quando estaria ao pé desse objeto seria possível mudar de frase,
a questão é como faço para a frase iniçial apareçer apenas quando chego ao pé do outro objeto e clico no space??

O tutorial está bom e bem explicado.

G_STF

Ranking : Nota C
Número de Mensagens : 46
Data de inscrição : 11/03/2014
Notas recebidas : C+C
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tutorial: Diálogo e Banco de Frases

Mensagem por Willy em Qui 24 Abr 2014, 18:04

Bom, vou ressaltar alguns pontos:

1 - Sempre que for iniciar um diálogo, lembre-se sempre de definir "Frase" como 1. Isso serve para que o personagem "pegue a conversa do começo".
2 - O código presente no step não é o foco do tutorial, trata-se apenas de um exemplo de como navegar por entre as arrays. Foi apenas um modo de demonstrar como faz para percorrer frase por frase de um diálogo (primeiro if) e como se faz para trocar o diálogo quando o anterior acabou (segundo if), portanto, esse esquema não serve para uma conversa normal. Imagine que o jogador encontra uma quest. A primeira conversa, o NPC fala seu problema e pergunta se o jogador quer ajudar. Se o jogador aceitar, ele parte para a 2ª conversa na qual ele tem que buscar uma quantidade de itens. Se o jogador voltar com todos os itens, o NPC vai para a 3ª conversa em que ele agradece e dá um premio ao jogador, caso contrário, ele diz os itens que faltam (4ª conversa). Se o jogador já tiver completado a quest e recebido seu premio, se ele falar com o NPC, ele agradecerá novamente (5ª conversa). Perceba que para esse NPC você teria que criar uma serie de condições para saber qual é a conversa ideal para a situação.

Bom, referente a sua pergunta... Você deve checar se o personagem está colidindo com o outro para poder liberar a conversa, caso contrário, não fala nada e Frase volta a ser 1 (para que quando ele for voltar a falar com ele, comece tudo de novo). Pelo o que você disse, essa seria a logica correta, entretanto, não sei se entendi muito bem sua pergunta.

___________


Engines, tutoriais e projetos? Clique no banner!



Atenção:
Comporte-se, senão você vai levar a cintada do Willy no meio da bunda! bravo


Willy

Ranking : Nota A
Número de Mensagens : 1812
Idade : 23
Data de inscrição : 08/06/2009
Notas recebidas : C + B + A + A
Reputação : 245
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 1
   : 1

http://willy-gmbr.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tutorial: Diálogo e Banco de Frases

Mensagem por fredcobain em Sab 03 Maio 2014, 23:27

Tuto muito bem escrito, organizado, identado e ainda com engine.
Nada que não fosse esperado dada a reputação do autor.
Movendo para aprovados.

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Tutorial: Diálogo e Banco de Frases

Mensagem por Conteúdo patrocinado Hoje à(s) 08:10


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum