Avatar do usuário
Eduardo Macedo
Membro
Membro
Autor
Mensagens: 31
Registrado em: Sáb Ago 22, 2015 6:46 pm
Karma: 10

Diálogo com npc

Sex Ago 26, 2016 9:46 pm

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 imagem abaixo:

Imagem

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:
showdialog = false

no Evento Step
Código:
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:
dialogo[0] = "ola" 
dialogo[1] = "bem vindo"
dialogo[2] = "sou mai um npc"
dialogo[3] = "" //ATENÇÂO


Código:
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:
// 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:
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:
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:
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.

Tags:
 
Avatar do usuário
Pesifas
Novato
Novato
Mensagens: 3
Registrado em: Qui Set 29, 2016 11:37 pm
Karma: 0

Re: Diálogo com npc

Ter Out 18, 2016 9:49 pm

A primeira imagem está com o Link quebrado. Poderei posta-la novamente ?
Pesifas

Mirrah Studio
 
Avatar do usuário
Eduardo Macedo
Membro
Membro
Autor
Mensagens: 31
Registrado em: Sáb Ago 22, 2015 6:46 pm
Karma: 10

Re: Diálogo com npc

Qui Out 20, 2016 12:55 am

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-
1
 
Player02
Novato
Novato
Mensagens: 2
Registrado em: Qui Dez 06, 2018 6:56 am
Karma: 0

Re: Diálogo com npc

Seg Dez 10, 2018 12:32 pm

Vc poderia me falar o codigo para o scr_move ?
agradeço desde já
 
Avatar do usuário
None
Administrador
Administrador
Mensagens: 255
Registrado em: Sáb Abr 14, 2018 8:11 pm
Karma: 644

Re: Diálogo com npc

Seg Dez 10, 2018 6:35 pm

viewtopic.php?f=116&t=65

Código de movimento
1
Cachorro-quente!!!

Como criar um jogo de RPG Japonês no estilo Final Fantasy https://goo.gl/efr6fx
 
Avatar do usuário
oscar11223
Novato
Novato
Mensagens: 4
Registrado em: Sex Dez 25, 2015 8:33 pm
Karma: 10

Re: Diálogo com npc

Qui Dez 20, 2018 7:34 pm

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?
2

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes