Merge pull request #43399 from KoBeWi/path_stalking

Update PathFollow2D when curve is changed
This commit is contained in:
Rémi Verschelde 2023-01-16 09:24:03 +01:00
commit 5663c78bd2
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 30 additions and 0 deletions

View File

@ -31,6 +31,7 @@
#include "path_2d.h"
#include "core/math/geometry_2d.h"
#include "scene/main/timer.h"
#ifdef TOOLS_ENABLED
#include "editor/editor_scale.h"
@ -171,6 +172,12 @@ void Path2D::_curve_changed() {
}
queue_redraw();
for (int i = 0; i < get_child_count(); i++) {
PathFollow2D *follow = Object::cast_to<PathFollow2D>(get_child(i));
if (follow) {
follow->path_changed();
}
}
}
void Path2D::set_curve(const Ref<Curve2D> &p_curve) {
@ -200,6 +207,14 @@ void Path2D::_bind_methods() {
/////////////////////////////////////////////////////////////////////////////////
void PathFollow2D::path_changed() {
if (update_timer && !update_timer->is_stopped()) {
update_timer->start();
} else {
_update_transform();
}
}
void PathFollow2D::_update_transform() {
if (!path) {
return;
@ -230,6 +245,16 @@ void PathFollow2D::_update_transform() {
void PathFollow2D::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY: {
if (Engine::get_singleton()->is_editor_hint()) {
update_timer = memnew(Timer);
update_timer->set_wait_time(0.2);
update_timer->set_one_shot(true);
update_timer->connect("timeout", callable_mp(this, &PathFollow2D::_update_transform));
add_child(update_timer, false, Node::INTERNAL_MODE_BACK);
}
} break;
case NOTIFICATION_ENTER_TREE: {
path = Object::cast_to<Path2D>(get_parent());
if (path) {

View File

@ -34,6 +34,8 @@
#include "scene/2d/node_2d.h"
#include "scene/resources/curve.h"
class Timer;
class Path2D : public Node2D {
GDCLASS(Path2D, Node2D);
@ -65,6 +67,7 @@ public:
private:
Path2D *path = nullptr;
real_t progress = 0.0;
Timer *update_timer = nullptr;
real_t h_offset = 0.0;
real_t v_offset = 0.0;
real_t lookahead = 4.0;
@ -81,6 +84,8 @@ protected:
static void _bind_methods();
public:
void path_changed();
void set_progress(real_t p_progress);
real_t get_progress() const;