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
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
}
}
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: Selecionar todos
dialogo[0] = "..."
dialogo[1] = "" //ATENÇÂO
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
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
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
}
Código:
Código: Selecionar todos
dialogo[0] = "esta quest esta desativada"
dialogo[1] = ""
if quest = ativa
{
dialogo[0] = "quest ativa"
dialogo[1] = ""
}