From 3c8b0882d7fef8b3fd953d73adf7c7e3b6df3e84 Mon Sep 17 00:00:00 2001 From: Katja Date: Wed, 5 Jun 2024 18:11:37 +0200 Subject: [PATCH] Returning from point and returning empty array from C++ if no path found. --- demo/bin/multilevel_astar.gd | 8 ++------ demo/main.gd | 4 ++-- src/MultilevelAStarEx.cpp | 12 +++++------- src/MultilevelAStarEx.h | 2 +- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/demo/bin/multilevel_astar.gd b/demo/bin/multilevel_astar.gd index e4fcc94..1983d1c 100644 --- a/demo/bin/multilevel_astar.gd +++ b/demo/bin/multilevel_astar.gd @@ -56,13 +56,9 @@ func is_blocked(point: Vector2i) -> bool: return (_astar.get_terrain(point) == MultilevelAStarEx.BLOCKED) or _astar.get_unit(point) +# returns a list of points containing the path (including the starting point) or an empty array if no path was found func find_path(from: Vector2i, to: Vector2i, return_closest: bool = false) -> Array[Vector2i]: assert(_used_rect.has_point(from)) assert(_used_rect.has_point(to)) - var res = _astar.find_path(from, to, return_closest) # returns Variant: null or Array[Vector2i] - - if res != null: - return res - else: - return [] + return _astar.find_path(from, to, return_closest) diff --git a/demo/main.gd b/demo/main.gd index 11366a7..eef3ca3 100644 --- a/demo/main.gd +++ b/demo/main.gd @@ -61,10 +61,10 @@ func find_path() -> void: var arr = astar.find_path(from, to, check_box.button_pressed) # vrne Variant: null ali Array #print(arr) + print(arr.size()) - if arr.size() > 0: + if arr.size() > 1: # if the start and the end are the same there is no line to draw # add new path - path_line.add_point(from * CELL_SIZE + Vector2i(16, 16)) for vec in arr: #print("%s, %s" % [vec.x, vec.y]) path_line.add_point(vec * CELL_SIZE + Vector2i(16, 16)) diff --git a/src/MultilevelAStarEx.cpp b/src/MultilevelAStarEx.cpp index 698bcc5..d2451a4 100644 --- a/src/MultilevelAStarEx.cpp +++ b/src/MultilevelAStarEx.cpp @@ -226,13 +226,11 @@ TypedArray MultilevelAStarEx::generate_path(const Node *current) const int cnt = 0; for (const Node *n = current; n != nullptr; n = n->parent) cnt++; - cnt--; // because we're not adding the starting node - TypedArray arr; arr.resize(cnt); int i = cnt; - while (current->parent != nullptr) + while (current != nullptr) { arr[--cnt] = Vector2i(current->x, current->y) + _trans; current = current->parent; @@ -241,7 +239,7 @@ TypedArray MultilevelAStarEx::generate_path(const Node *current) const return arr; } -Variant MultilevelAStarEx::find_path(const Vector2i &from, const Vector2i &to, bool return_closest) +TypedArray MultilevelAStarEx::find_path(const Vector2i &from, const Vector2i &to, bool return_closest) { DEV_ASSERT(_init); @@ -312,7 +310,7 @@ Variant MultilevelAStarEx::find_path(const Vector2i &from, const Vector2i &to, b if (current->distanceToEnd == 0) { // found the path - return Variant(generate_path(current)); + return generate_path(current); } // close it @@ -381,8 +379,8 @@ Variant MultilevelAStarEx::find_path(const Vector2i &from, const Vector2i &to, b if (return_closest) { // return path to closest - return Variant(generate_path(closest)); + return generate_path(closest); } - return Variant(); + return TypedArray(); } diff --git a/src/MultilevelAStarEx.h b/src/MultilevelAStarEx.h index c0a6d0b..58fa220 100644 --- a/src/MultilevelAStarEx.h +++ b/src/MultilevelAStarEx.h @@ -78,7 +78,7 @@ public: TerrainType get_terrain(const Vector2i &cell) const; void set_unit(const Vector2i &cell, bool blocked); bool get_unit(const Vector2i &cell) const; - Variant find_path(const Vector2i &from, const Vector2i &to, bool return_closest); + TypedArray find_path(const Vector2i &from, const Vector2i &to, bool return_closest); }; }