Página 1 de 1

[PROG] Tutorial: Diálogo e Banco de Frases

Enviado: Sex Abr 29, 2016 10:33 am
por Tutoriais & Aulas
Autor original: Willy
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, usarei 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: Clique para ver o conteúdo
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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

///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: Selecionar todos

///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: Selecionar todos

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: Selecionar todos

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! 

Flws... :blz: