Página 1 de 1

Diálogo com npc

Enviado: Sex Ago 26, 2016 9:46 pm
por Eduardo Macedo
Vamos aprender a criar uma caixa de dialogo com efeito de maquina de escrever

Antes de iniciar crie os recursos necessários que iremos utilizar de acordo com a engine abaixo:

https://1drv.ms/u/s!ApLvKkETuc9ziCjfHC63-rCGqfP-

scr_move = script de movimentação (faça do jeito que quiser)

obj_dialog = será nossa caixa de texto e coloque o spr_dialog nesse objeto, somente para efeitos visuais
obj_contato_npc = servirá como objeto pai do obj_npc1 e obj_npc2, ele somente existirá sem código algum.

então faça o parentesco deles.

criei também uma font_arial configurado com a tabela ASCII para ter todos os caracteres da língua portuguesa.
acredito que não preciso explicar a funcionalidade de tudo , então vamos prosseguir.

Primeiro vamos abrir o obj_player, no evento Create deixamos a caixa de dialogo desativada.
Código:

Código: Selecionar todos

showdialog = false
no Evento Step
Código:

Código: Selecionar todos

if showdialog == false {scr_move} //vai impedir que o player faça qualquer movimento enquanto estiver "conversando".

if instance_position(x,y,obj_contato_npc) // se o jogador está encostando em qualquer npc(lembra do parentesco?)
{
    if keyboard_check_pressed(vk_enter)//se apertar enter 
    {
        if showdialog == false // se a caixa de dialogo não estiver ativa
        {
            showdialog = true  // irá ativar a caixa de dialogo   
        }
    }
}

if showdialog //verifica se o dialogo estiver ativo
{
    if !instance_exists(obj_dialog)// se estiver ativo verifica se a caixa de dialogo está fechada
    {
        instance_create(x,y-64,obj_dialog) //cria a caixa de dialogo
    }
}
Antes de passar para os códigos do obj_dialog vamos entender uma coisa:

Todas as variáveis que guardam o que cada NPC fala irão ficar no obj dos seus respectivos NPCs, com esse método você pode criar
quantos NPCs quiser somente deixando o obj_contato_npc como sendo o pai de todos os NPCs e escrevendo seu dialogo da seguinte forma:

o tamanho do dialogo não importa , a array pode ser enorme que não da problema

Código:

Código: Selecionar todos

dialogo[0] = "ola" 
dialogo[1] = "bem vindo"
dialogo[2] = "sou mai um npc"
dialogo[3] = "" //ATENÇÂO 
Código:

Código: Selecionar todos

dialogo[0] = "..." 
dialogo[1] = "" //ATENÇÂO
Observe que o ultimo texto do dialogo é obrigatório estar vazio pra que o programa reconheça que o dialogo acabou.

Dando prosseguimento ao tutorial vamos programar o objeto que faz a mágica acontecer
No obj_dialog no Evento Create:
Código:

Código: Selecionar todos

// Sempre que o objeto for criado:
image_index = 0 //a primeira sub imagem é a de número zero
image_speed = 1//velocidade da animação da caixa de texto
inst = instance_position(obj_player.x,obj_player.y,obj_contato_npc) //atribui o valor da ID do NPC que está interagindo
t = 0 //essa variável serve pra pular para a próxima fala do NPC
contador = 0 // serve pra dar o efeito de maquina de escrever quando for desenhar o texto
texto = "" // variável que será desenhada depois de todo o processo
Prosseguindo pra o Evento Step
Código:

Código: Selecionar todos

if obj_player.showdialog == false {instance_destroy()} //se desativar a caixa de dialogo a instância dela é destruída também
if image_index == image_number -1 {image_speed = 0}// se a imagem da animação for igual a sua ultima imagem a animação para
No Evento Draw

Código:

Código: Selecionar todos

draw_self() // Desenha a si mesmo , usado para não ter bug no evento draw
draw_set_font(font_arial)//define a fonte do texto configurado com a tabela ACSII

if obj_dialog.image_speed == 0//se a velocidade da imagem da caixa de texto for igual a zero, evita que o texto seja desenhado 
//antes que a caixa de texto abra. 
    {
        if string_length(texto) < string_length(inst.dialogo[t])//se o texto for menor que o texto de origem
        {
            texto = string_copy(inst.dialogo[t],1,contador) /*copia o primeiro caractere do texto[t] até a posição do caractere 
            determinado pelo número da variável contador*/
            contador++ //contador aumenta mais uma unidade         
        }
        if string_length(texto) == string_length(inst.dialogo[t])// se os textos forem iguais 
        {
            if keyboard_check_pressed(vk_enter) // e apertar enter
            {
                contador = 0 // reinicia o contador
                if string_length(inst.dialogo[t+1]) > 0 //se o tamanho do próximo texto for maior que zero(por isso a ultima frase tem que ser //vazia
                {
                    texto = "" //limpa o texto 
                    t ++ //variável "t" aumenta mais uma unidade         
                }
                else // se o próximo texto for vazio e apertar enter 
                {
                    obj_player.showdialog = false // o dialogo é desativado
                    t = 0 // variável "t" zera, para q o NPC comece o dialogo do inicio
                    inst.primeiro_contato = false // verifica se é o primeiro contato com o NPC, serve para o mesmo NPC ter diálogos diferentes, muito útil para quests e mudanças que podem ocorrer no jogo.
                }
            }
        }
// desenhar o texto fica ao seu critério 
            draw_text_ext(x - 120,y - 28 ,texto,16,240) // desenha o texto na posição determinada

    }
Para usar vários diálogos nos NPCs precisa colocar uma variável de controle no evento step do NPC

Código:

Código: Selecionar todos

dialogo[0] = "esta quest esta desativada"
dialogo[1] = ""

if quest = ativa
{
dialogo[0] = "quest ativa"
dialogo[1] = ""
}
Nunca esquecendo de deixar a ultima frase em branco.

Re: Diálogo com npc

Enviado: Ter Out 18, 2016 9:49 pm
por Pesifas
A primeira imagem está com o Link quebrado. Poderei posta-la novamente ?

Re: Diálogo com npc

Enviado: Qui Out 20, 2016 12:55 am
por Eduardo Macedo
A imagem aparece p mim mas ela não interfere ,é somente uma representação visual dos sprites e objetos que devem ser criados , só ir criando os objetos de acordo com o que o texto pede.

link da engine
https://1drv.ms/u/s!ApLvKkETuc9ziCjfHC63-rCGqfP-

Re: Diálogo com npc

Enviado: Seg Dez 10, 2018 12:32 pm
por Player02
Vc poderia me falar o codigo para o scr_move ?
agradeço desde já

Re: Diálogo com npc

Enviado: Seg Dez 10, 2018 6:35 pm
por None
viewtopic.php?f=116&t=65

Código de movimento

Re: Diálogo com npc

Enviado: Qui Dez 20, 2018 7:34 pm
por oscar11223
Olá! Gostei muito do tutorial! Mas estou com uma duvida, é o seguinte: Eu gostaria de criar um npc que indica a vitoria do jogador e finaliza o jogo, como eu poderia fazer isso?