diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-01-16 09:24:03 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-01-16 09:24:03 +0100 |
commit | 5663c78bd2b53a95f3e7cd498cd89760cca5002c (patch) | |
tree | 884244acd4acb1339575c3fd781618386eda6519 | |
parent | ba551727efb84e5e25cc5f2e89f14a11b7cbe372 (diff) | |
parent | 5d75edb3b593a74db02fce59a63b63e99edecdf7 (diff) |
Merge pull request #43399 from KoBeWi/path_stalking
Update PathFollow2D when curve is changed
-rw-r--r-- | scene/2d/path_2d.cpp | 25 | ||||
-rw-r--r-- | scene/2d/path_2d.h | 5 |
2 files changed, 30 insertions, 0 deletions
diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 09f4406ffe..5036dd30b1 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -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) { diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h index 884743dd2a..89c77c49eb 100644 --- a/scene/2d/path_2d.h +++ b/scene/2d/path_2d.h @@ -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; |