0 votes

Hello friends!

I want to have my dialogue boxes animate when they pop up, so I tweened 'rect_size' to go from Vector2(0, 0) to the full size. And it works great!

Once.

After the first time I talk to an NPC, every subsequent interaction the dialogue box pops up fully formed with no tweening. Like once it's been used, it's not resetting, or SOMETHING. Everything else seems to work fine.

(Possibly-related question - I would love to be able to tween OUT the box, when the player closes out of the dialogue. I tried adding a separate tween for closing but it created a whole new set of problems)

Really appreciate any ideas y'all might have about how to get this working more than once. See below for my code. The popup contains three ColorRects on top of each other to give a frame effect, that's why it seems to be called three times on _ready.

extends Popup

var npc_name setget name_set
var dialogue setget dialogue_set
var answers setget answers_set
var npc

onready var effect = get_node("Open")
onready var sprite = get_node("ColorRect")
onready var sprite2 = get_node("ColorRect2")
onready var sprite3 = get_node("ColorRect3")

func _ready():
    set_process_input(false)
    effect.interpolate_property(sprite, 'rect_size', Vector2(0, 0), Vector2(300, 95), 0.3,
    Tween.TRANS_SINE, Tween.EASE_OUT)
    effect.interpolate_property(sprite2, 'rect_size', Vector2(0, 0), Vector2(304, 99), 0.3,
    Tween.TRANS_SINE, Tween.EASE_OUT)
    effect.interpolate_property(sprite3, 'rect_size', Vector2(0, 0), Vector2(308, 103), 0.3,
    Tween.TRANS_SINE, Tween.EASE_OUT)
    effect.interpolate_property(sprite, 'modulate',
    Color(0,0,0,0), Color(1,1,1,1), 0.3,
    Tween.TRANS_SINE, Tween.EASE_OUT)

func name_set(new_value):
    npc_name = new_value
    $ColorRect/NPCName.text = new_value

func dialogue_set(new_value):
    dialogue = new_value
    $ColorRect/Dialogue.text = new_value

func answers_set(new_value):
    answers = new_value
    $ColorRect/Answers.text = new_value

func open():
    get_tree().paused = true
    effect.start()
    popup()
    $AnimationPlayer.playback_speed = 30.0 / dialogue.length()
    $AnimationPlayer.play("ShowDialogue")

func _on_Open_tween_completed(object, key):
    pass 

func _input(event):
    if event is InputEventKey:
        if event.scancode == KEY_A:
            set_process_input(false)
            npc.talk("A")
        elif event.scancode == KEY_B:
            set_process_input(false)
            npc.talk("B")

func close():
    get_tree().paused = false
    hide()

func _on_AnimationPlayer_animation_finished(anim_name):
    set_process_input(true)
Godot version 3.2.3
in Engine by (127 points)

1 Answer

0 votes
Best answer

Your code is in the "ready" function, which only runs once. You will need to run the code every time you show the dialogue.

by (7,190 points)
selected by

The tween's parameters are set in _ready, but it's not called until the dialogue box is triggered at func open(), by effect.start()

I tried moving the tween code into func open(), but then no tweening happens at all.

Is there a better place for effect.start() than func open()? And a better place for the tween parameters than _ready?

Appreciate you!

You need to call interpolate property every time you want to do it not just once.

That worked!!

When I put the full interpolate_property code block in open() before, nothing happened. Not sure what I did differently now but I appreciate the help!!

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.