Pupilo Maker

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

Criação de Jogos


    Diálogo com npc

    avatar
    Macedo


    Mensagens : 28
    Data de inscrição : 18/02/2014
    Idade : 33
    Localização : Rio de Janeiro

    Diálogo com npc Empty Diálogo com npc

    Mensagem por Macedo Qui Ago 25 2016, 17:43

    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:



    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.

      Data/hora atual: Qui Mar 28 2024, 14:43