mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-04 15:00:09 +01:00
Port Navigation Polygon 2D demo to Godot 4.1 (#955)
This commit is contained in:
@@ -1,14 +1,13 @@
|
||||
# Navigation Polygon 2D
|
||||
|
||||
Example of using 2D navigation using a
|
||||
[`NavigationPolygon`](https://docs.godotengine.org/en/latest/classes/class_navigationpolygon.html)
|
||||
in a [`NavigationPolygonInstance`](https://docs.godotengine.org/en/latest/classes/class_navigationpolygoninstance.html) node.
|
||||
It uses the 2D navigation API to request a path between two points,
|
||||
and then traverses the resulting path.
|
||||
Example of using 2D navigation using:
|
||||
- [`NavigationRegion2D`](https://docs.godotengine.org/en/latest/classes/class_navigationregion2d.html)
|
||||
- [`NavigationPolygon`](https://docs.godotengine.org/en/latest/classes/class_navigationpolygon.html)
|
||||
- [`NavigationAgent2D`](https://docs.godotengine.org/en/latest/classes/class_navigationagent2d.html)
|
||||
|
||||
Language: GDScript
|
||||
|
||||
Renderer: GLES 2
|
||||
Renderer: Forward+
|
||||
|
||||
Check out this demo on the asset library: https://godotengine.org/asset-library/asset/117
|
||||
|
||||
|
||||
36
2d/navigation/character.gd
Normal file
36
2d/navigation/character.gd
Normal file
@@ -0,0 +1,36 @@
|
||||
extends CharacterBody2D
|
||||
|
||||
|
||||
var movement_speed: float = 200.0
|
||||
@onready var navigation_agent: NavigationAgent2D = $NavigationAgent2D
|
||||
|
||||
|
||||
func _ready():
|
||||
# These values need to be adjusted for the actor's speed
|
||||
# and the navigation layout.
|
||||
navigation_agent.path_desired_distance = 2.0
|
||||
navigation_agent.target_desired_distance = 2.0
|
||||
navigation_agent.debug_enabled = true
|
||||
|
||||
|
||||
# The "click" event is a custom input action defined in
|
||||
# Project > Project Settings > Input Map tab.
|
||||
func _unhandled_input(event):
|
||||
if not event.is_action_pressed("click"):
|
||||
return
|
||||
set_movement_target(get_global_mouse_position())
|
||||
|
||||
|
||||
func set_movement_target(movement_target: Vector2):
|
||||
navigation_agent.target_position = movement_target
|
||||
|
||||
|
||||
func _physics_process(_delta):
|
||||
if navigation_agent.is_navigation_finished():
|
||||
return
|
||||
|
||||
var current_agent_position: Vector2 = global_position
|
||||
var next_path_position: Vector2 = navigation_agent.get_next_path_position()
|
||||
|
||||
velocity = current_agent_position.direction_to(next_path_position) * movement_speed
|
||||
move_and_slide()
|
||||
@@ -16,9 +16,9 @@ dest_files=["res://.godot/imported/character.png-7a996d3b758d22c506b76a7c1539128
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/bptc_ldr=0
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
|
||||
22
2d/navigation/character.tscn
Normal file
22
2d/navigation/character.tscn
Normal file
@@ -0,0 +1,22 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://ct7veakwiei3h"]
|
||||
|
||||
[ext_resource type="Script" path="res://character.gd" id="1_8uimh"]
|
||||
[ext_resource type="Texture2D" uid="uid://b0wokaenwu7pj" path="res://character.png" id="1_rmg12"]
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_20ukx"]
|
||||
radius = 7.0
|
||||
height = 22.0
|
||||
|
||||
[node name="Character" type="CharacterBody2D"]
|
||||
script = ExtResource("1_8uimh")
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
position = Vector2(0, -3)
|
||||
scale = Vector2(0.3, 0.3)
|
||||
texture = ExtResource("1_rmg12")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
position = Vector2(0, -3)
|
||||
shape = SubResource("CapsuleShape2D_20ukx")
|
||||
|
||||
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."]
|
||||
@@ -1,32 +0,0 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://cur17tkfqetf0"]
|
||||
|
||||
[ext_resource type="Script" path="res://navigation.gd" id="1"]
|
||||
[ext_resource type="Texture2D" uid="uid://bk26gi6qsuh18" path="res://map.png" id="2"]
|
||||
[ext_resource type="Texture2D" uid="uid://b0wokaenwu7pj" path="res://character.png" id="3"]
|
||||
|
||||
[sub_resource type="NavigationPolygon" id="NavigationPolygon_5ynhe"]
|
||||
vertices = PackedVector2Array(682, 496, 696, 300, 704, 507, 495, 256, 589, 270, 540, 284, 466, 177, 490, 169, 531, 178, 477, 205, 446, 196, 621, 510, 667, 525, 606, 519, 529, 290, 288, 228, 228, 180, 276, 160, 315, 190, 600, 497, 576, 503, 202, 99, 314, 65, 311, 83, 436, 170, 452, 163, 201, 440, 246, 478, 223, 490, 211, 485, 146, 400, 185, 381, 586, 178, 596, 188, 474, 252, 462, 127, 479, 150, 416, 180, 395, 516, 302, 499, 320, 450, 354, 445, 535, 516, 538, 106, 537, 173, 493, 166, 506, 97, 514, 51, 486, 83, 327, 77, 309, 96, 306, 113, 272, 153, 219, 172, 178, 152, 148, 224, 189, 231, 171, 328, 176, 347, 259, 404, 432, 249, 365, 346, 525, 342, 314, 340, 271, 336, 241, 321, 235, 284, 242, 247, 324, 336, 616, 360, 645, 381, 645, 404, 614, 492)
|
||||
polygons = [PackedInt32Array(0, 1, 2), PackedInt32Array(3, 4, 5), PackedInt32Array(6, 7, 8, 9, 10), PackedInt32Array(11, 0, 2, 12, 13), PackedInt32Array(3, 5, 14), PackedInt32Array(15, 16, 17, 18), PackedInt32Array(19, 11, 13, 20), PackedInt32Array(21, 22, 23), PackedInt32Array(6, 10, 24, 25), PackedInt32Array(26, 27, 28, 29, 30), PackedInt32Array(31, 26, 30), PackedInt32Array(32, 33, 3, 34), PackedInt32Array(18, 35, 36, 25, 24), PackedInt32Array(18, 24, 37), PackedInt32Array(38, 39, 40, 41, 42), PackedInt32Array(43, 44, 45, 46), PackedInt32Array(47, 43, 46, 48), PackedInt32Array(49, 47, 48, 50, 23), PackedInt32Array(21, 23, 50, 51, 52, 53, 54), PackedInt32Array(55, 54, 53, 56), PackedInt32Array(30, 55, 56, 57), PackedInt32Array(30, 57, 58), PackedInt32Array(31, 30, 58), PackedInt32Array(31, 58, 59, 40), PackedInt32Array(40, 59, 41), PackedInt32Array(18, 37, 60, 15), PackedInt32Array(20, 42, 41, 61, 60, 34, 3, 62), PackedInt32Array(63, 64, 65, 66, 67, 15, 60, 68), PackedInt32Array(61, 68, 60), PackedInt32Array(62, 69, 70, 71, 72, 19, 20), PackedInt32Array(62, 3, 14)]
|
||||
outlines = [PackedVector2Array(314, 65, 311, 83, 327, 77, 514, 51, 538, 106, 537, 173, 493, 166, 506, 97, 486, 83, 309, 96, 306, 113, 272, 153, 219, 172, 189, 231, 171, 328, 176, 347, 259, 404, 354, 445, 365, 346, 324, 336, 314, 340, 271, 336, 241, 321, 235, 284, 242, 247, 288, 228, 228, 180, 276, 160, 315, 190, 462, 127, 479, 150, 452, 163, 466, 177, 490, 169, 531, 178, 477, 205, 446, 196, 436, 170, 416, 180, 432, 249, 474, 252, 586, 178, 596, 188, 495, 256, 589, 270, 540, 284, 529, 290, 525, 342, 616, 360, 645, 381, 645, 404, 614, 492, 600, 497, 621, 510, 682, 496, 696, 300, 704, 507, 667, 525, 606, 519, 576, 503, 535, 516, 395, 516, 302, 499, 320, 450, 185, 381, 201, 440, 246, 478, 223, 490, 211, 485, 146, 400, 148, 224, 178, 152, 202, 99)]
|
||||
|
||||
[node name="Node2D" type="Node2D"]
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="Map" type="Sprite2D" parent="."]
|
||||
position = Vector2(429.585, 287.32)
|
||||
texture = ExtResource("2")
|
||||
|
||||
[node name="Camera2D" type="Camera2D" parent="."]
|
||||
offset = Vector2(420, 300)
|
||||
current = true
|
||||
|
||||
[node name="Character" type="Sprite2D" parent="."]
|
||||
position = Vector2(228.464, 132.594)
|
||||
scale = Vector2(0.5, 0.5)
|
||||
texture = ExtResource("3")
|
||||
offset = Vector2(0, -26)
|
||||
|
||||
[node name="NavigationRegion2d" type="NavigationRegion2D" parent="."]
|
||||
navpoly = SubResource("NavigationPolygon_5ynhe")
|
||||
|
||||
[node name="NavigationAgent2d" type="NavigationAgent2D" parent="."]
|
||||
@@ -16,9 +16,9 @@ dest_files=["res://.godot/imported/map.png-9eea34967fae34f4388f4a32a16da936.ctex
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/bptc_ldr=0
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
extends Node2D
|
||||
|
||||
@export var character_speed: float = 400.0
|
||||
var path = []
|
||||
|
||||
@onready var character = $Character
|
||||
|
||||
#var navmap = NavigationServer2D.map_create()
|
||||
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
#NavigationServer2D.region_set_map(navmap, $NavigationRegion2d.get_rid())
|
||||
|
||||
|
||||
func _process(delta):
|
||||
character.position = $NavigationAgent2d.get_next_location()
|
||||
var walk_distance = character_speed * delta
|
||||
#move_along_path(walk_distance)
|
||||
|
||||
|
||||
# The "click" event is a custom input action defined in
|
||||
# Project > Project Settings > Input Map tab.
|
||||
func _unhandled_input(event):
|
||||
if not event.is_action_pressed("click"):
|
||||
return
|
||||
_update_navigation_path(Vector2(), get_local_mouse_position())
|
||||
|
||||
#func move_along_path(distance):
|
||||
# return
|
||||
# var last_point = character.position
|
||||
# while path.size():
|
||||
# var distance_between_points = last_point.distance_to(path[0])
|
||||
# # The position to move to falls between two points.
|
||||
# if distance <= distance_between_points:
|
||||
# character.position = last_point.lerp(path[0], distance / distance_between_points)
|
||||
# return
|
||||
# # The position is past the end of the segment.
|
||||
# distance -= distance_between_points
|
||||
# last_point = path[0]
|
||||
# path.remove(0)
|
||||
# # The character reached the end of the path.
|
||||
# character.position = last_point
|
||||
# set_process(false)
|
||||
|
||||
var drawpos = Vector2()
|
||||
func _update_navigation_path(start_position, end_position):
|
||||
# get_simple_path is part of the Node2D class.
|
||||
# It returns a PackedVector2Array of points that lead you
|
||||
# from the start_position to the end_position.
|
||||
$NavigationAgent2d.set_target_location(end_position)
|
||||
drawpos = end_position
|
||||
queue_redraw()
|
||||
# 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)
|
||||
|
||||
func _draw():
|
||||
draw_circle(drawpos, 10, Color.RED)
|
||||
18
2d/navigation/navigation.tscn
Normal file
18
2d/navigation/navigation.tscn
Normal file
@@ -0,0 +1,18 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bjgad00c2xiuc"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://bk26gi6qsuh18" path="res://map.png" id="2_nxfkp"]
|
||||
[ext_resource type="NavigationPolygon" uid="uid://bk5r48dcijlqt" path="res://navigation_polygon.res" id="3_6c0vu"]
|
||||
[ext_resource type="PackedScene" uid="uid://ct7veakwiei3h" path="res://character.tscn" id="4_n6iop"]
|
||||
|
||||
[node name="Navigation" type="Node2D"]
|
||||
|
||||
[node name="Map" type="Sprite2D" parent="."]
|
||||
z_index = -1
|
||||
position = Vector2(400, 302)
|
||||
texture = ExtResource("2_nxfkp")
|
||||
|
||||
[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."]
|
||||
navigation_polygon = ExtResource("3_6c0vu")
|
||||
|
||||
[node name="Character" parent="." instance=ExtResource("4_n6iop")]
|
||||
position = Vector2(211, 141)
|
||||
BIN
2d/navigation/navigation_polygon.res
Normal file
BIN
2d/navigation/navigation_polygon.res
Normal file
Binary file not shown.
@@ -14,10 +14,10 @@ config/name="Navigation Polygon 2D"
|
||||
config/description="Example of using 2D navigation using a NavigationPolygon in a
|
||||
NavigationPolygonInstance node. It uses the 2D navigation API to request
|
||||
a path between two points, and then traverses the resulting path."
|
||||
run/main_scene="res://level.tscn"
|
||||
config/features=PackedStringArray("4.0")
|
||||
config/icon="res://icon.webp"
|
||||
config/tags=PackedStringArray("2d", "ai", "demo", "official")
|
||||
run/main_scene="res://navigation.tscn"
|
||||
config/features=PackedStringArray("4.1")
|
||||
config/icon="res://icon.webp"
|
||||
|
||||
[display]
|
||||
|
||||
@@ -29,7 +29,7 @@ window/stretch/aspect="expand"
|
||||
|
||||
click={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null)
|
||||
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user