How can I do "# Maybe wait for X seconds with a timer before moving on" thing?

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

The idea is that i need an entity that moves to the random point around it, waits for several secondss, repeats the process. But in this example entity moves constantly without delay. I tried many things but when I managed to add wait time I somehow broke the is_at_target_position function.

enum {
    IDLE,
    WANDER
}

var velocity = Vector2.ZERO
var state = IDLE

const ACCELERATION = 300
const MAX_SPEED = 50
const TOLERANCE = 4.0

onready var start_position = global_position
onready var target_position = global_position

func update_target_position():
    var target_vector = Vector2(rand_range(-32, 32), rand_range(-32, 32))
    target_position = start_position + target_vector

func is_at_target_position(): 
    # Stop moving when at target +/- tolerance
    return (target_position - global_position).length() < TOLERANCE

func _physics_process(delta):
    match state:
        IDLE:
            state = WANDER
            # Maybe wait for X seconds with a timer before moving on
            update_target_position()

        WANDER:
            accelerate_to_point(target_position, ACCELERATION * delta)

            if is_at_target_position():
                state = IDLE

    velocity = move_and_slide(velocity)

func accelerate_to_point(point, acceleration_scalar):
    var direction = (point - global_position).normalized()
    var acceleration_vector = direction * acceleration_scalar
    accelerate(acceleration_vector)

func accelerate(acceleration_vector):
    velocity += acceleration_vector
    velocity = velocity.clamped(MAX_SPEED)
:bust_in_silhouette: Reply From: Gluon

Difficult to say without seeing your code to tell you how it broke the is_at_target_position function you have.

I would suggest that you create a boolean set it to false and when you create a timer set it to true. Once the timer is over just link the timer to a new function which turns the boolean to false again. Then in your wait function you can have a simple if clause to ask if the boolean is true or false and only allow movement if it is false.

My code is just a copy from a related answer. Anyway I understood you suggestion but it requiers major changes and my goal was slightly extend what I have so I will leave it for later.

Danver | 2022-04-08 12:02