godot-demo-projects/2d/navigation/navigation.gd

45 lines
1.4 KiB
GDScript3
Raw Normal View History

extends Navigation2D
2020-02-03 08:36:35 +01:00
export(float) var character_speed = 400.0
var path = []
2020-02-03 08:36:35 +01:00
func _process(delta):
var walk_distance = character_speed * delta
move_along_path(walk_distance)
# The 'click' event is a custom input action defined in
2020-02-03 08:36:35 +01:00
# Project > Project Settings > Input Map tab.
func _input(event):
2020-02-03 08:36:35 +01:00
if not event.is_action_pressed("click"):
return
_update_navigation_path($Character.position, get_local_mouse_position())
func move_along_path(distance):
var last_point = $Character.position
while path.size():
var distance_between_points = last_point.distance_to(path[0])
2020-02-03 08:36:35 +01:00
# The position to move to falls between two points.
if distance <= distance_between_points:
$Character.position = last_point.linear_interpolate(path[0], distance / distance_between_points)
return
2020-02-03 08:36:35 +01:00
# The position is past the end of the segment.
distance -= distance_between_points
last_point = path[0]
path.remove(0)
2020-02-03 08:36:35 +01:00
# The character reached the end of the path.
$Character.position = last_point
set_process(false)
2020-02-03 08:36:35 +01:00
func _update_navigation_path(start_position, end_position):
# get_simple_path is part of the Navigation2D class.
# It returns a PoolVector2Array of points that lead you
# from the start_position to the end_position.
path = get_simple_path(start_position, end_position, true)
# The first point is always the start_position.
# We don't need it in this example as it corresponds to the character's position.
path.remove(0)
set_process(true)