How can I activate the dialog box after clicking on an NPC

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By misaelbr3

I’m new in Godot, and I have a specific node for dialog boxes, but how do I make it so that when I click on an NPC or after a certain thing happens, the dialog appears on the screen?

   extends ColorRect
   export var dialogPath = ""
   export(float) var textSpeed = 0.05
   var diag0

   var dialog

   var phraseNum = 0
   var finished = false
   func _ready():
   	   $Timer.wait_time = textSpeed
   	   dialog = getDialog()
   	   assert(dialog,"Dialog not found")

   func getDialog() -> Array:
       var f =
   	   assert(f.file_exists(dialogPath), "File does not exists"), File.READ)
   	   var json = f.get_as_text()

   	   var output = parse_json(json)

   if typeof(output) == TYPE_ARRAY:
	   return output
	   return [] 

   func _process(delta):
   	   $Indicator.visible = finished
   	   if Input.is_action_just_pressed("click_left"):
   		   if finished:
   			   $Text.visible_characters = len($Text.text)

   func nextPhrase() -> void:
   	   if phraseNum >= len(dialog):
   	finished = false

   	$Name.bbcode_text = dialog[phraseNum]["Name"]
   	$Text.bbcode_text = dialog[phraseNum]["Text"]
   	$Text.visible_characters = 0

   	while $Text.visible_characters < len($Text.text):
   		   $Text.visible_characters += 1
   		   yield($Timer, "timeout")
   	finished = true
   	phraseNum += 1
:bust_in_silhouette: Reply From: Inces

This code is quite advanced, You are asking for easiest part of it :slight_smile:

One way to do it is to design signal for your dialog events with dialogPath and dialog position passed along signal. This would work with some high scope DialogMenager node, who will be connected to this signal, and will create new DialogBox at dialog position and pass dialogPath to it. Signal will be emitted by whatever You want, be it clicking NPC or reaching some area, dying and so on. Important thing with signals is to use Autoload as absolute emitter, so DialogMenager won’t have to connect to every single dialog initiator.