GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


Tutorial: Diálogo e Banco de Frases

3 participantes

Ir para baixo

Tutorial: Diálogo e Banco de Frases Empty Tutorial: Diálogo e Banco de Frases

Mensagem por Willy 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:
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
Willy
Willy

Games Ranking : Nota A

Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Reputação : 264
Número de Mensagens : 1890
Prêmios : Tutorial: Diálogo e Banco de Frases Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 2 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

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

JnickU gosta desta mensagem

Ir para o topo Ir para baixo

Tutorial: Diálogo e Banco de Frases Empty Re: Tutorial: Diálogo e Banco de Frases

Mensagem por G_STF 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
G_STF

Games Ranking : Nota C

Notas recebidas : C+C
Data de inscrição : 11/03/2014
Reputação : 3
Número de Mensagens : 46
Prêmios : Tutorial: Diálogo e Banco de Frases Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Tutorial: Diálogo e Banco de Frases Empty Re: Tutorial: Diálogo e Banco de Frases

Mensagem por Willy 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.
Willy
Willy

Games Ranking : Nota A

Notas recebidas : C + B + A + A
Data de inscrição : 08/06/2009
Reputação : 264
Número de Mensagens : 1890
Prêmios : Tutorial: Diálogo e Banco de Frases Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 2 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

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

Ir para o topo Ir para baixo

Tutorial: Diálogo e Banco de Frases Empty Re: Tutorial: Diálogo e Banco de Frases

Mensagem por fredcobain Sáb 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
fredcobain

Games Ranking : Sem avaliações

Data de inscrição : 14/04/2011
Reputação : 163
Número de Mensagens : 692
Prêmios : Tutorial: Diálogo e Banco de Frases Empty

Medalhas x 0 Tutoriais x 3 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Tutorial: Diálogo e Banco de Frases Empty Re: Tutorial: Diálogo e Banco de Frases

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos