Skip to content

Commit 0e8326e

Browse files
author
Chris Bradfield
committed
One Shot: Pathfinding on Tilemaps
1 parent fadddbd commit 0e8326e

12 files changed

+218
-0
lines changed

One_Shots/nav/attributions.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Art from Kenney.nl

One_Shots/nav/engine.cfg

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[application]
2+
3+
name="Pathfinding with Tilemaps"
4+
main_scene="res://main.tscn"
5+
icon="res://icon.png"
6+
7+
[input]
8+
9+
l_click=[mbutton(0, 1)]
10+
r_click=[mbutton(0, 2)]

One_Shots/nav/icon.png

2.67 KB
Loading

One_Shots/nav/icon.png.flags

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
gen_mipmaps=false

One_Shots/nav/main.gd

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
extends Node
2+
3+
signal map_update
4+
5+
var mob = preload("res://mob.tscn")
6+
7+
onready var start_pos = get_node("start_pos").get_pos()
8+
onready var end_pos = get_node("end_pos").get_pos()
9+
onready var nav = get_node("nav")
10+
onready var map = get_node("nav/map")
11+
12+
func _ready():
13+
set_process_input(true)
14+
15+
func _input(event):
16+
if event.type == InputEvent.MOUSE_BUTTON and event.pressed:
17+
var tile = map.world_to_map(event.pos)
18+
if event.button_index == 1:
19+
map.set_cell(tile.x, tile.y, 1)
20+
elif event.button_index == 2:
21+
map.set_cell(tile.x, tile.y, 0)
22+
if event.type == InputEvent.MOUSE_BUTTON and not event.pressed:
23+
emit_signal("map_update")
24+
25+
func _on_mob_timer_timeout():
26+
var m = mob.instance()
27+
add_child(m)
28+
m.set_pos(start_pos)
29+
m.goal = end_pos
30+
m.nav = nav
31+
connect("map_update", m, "update_path")

One_Shots/nav/main.tscn

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
[gd_scene load_steps=4 format=1]
2+
3+
[ext_resource path="res://main.gd" type="Script" id=1]
4+
[ext_resource path="res://tileset_grass_dirt.tres" type="TileSet" id=2]
5+
[ext_resource path="res://towerDefense_tilesheet.tex" type="Texture" id=3]
6+
7+
[node name="main" type="Node"]
8+
9+
script/script = ExtResource( 1 )
10+
11+
[node name="nav" type="Navigation2D" parent="."]
12+
13+
[node name="map" type="TileMap" parent="nav"]
14+
15+
mode = 0
16+
tile_set = ExtResource( 2 )
17+
cell/size = Vector2( 64, 64 )
18+
cell/quadrant_size = 16
19+
cell/custom_transform = Matrix32( 1, 0, 0, 1, 0, 0 )
20+
cell/half_offset = 2
21+
cell/tile_origin = 0
22+
cell/y_sort = false
23+
collision/use_kinematic = false
24+
collision/friction = 1.0
25+
collision/bounce = 0.0
26+
collision/layers = 1
27+
collision/mask = 1
28+
occluder/light_mask = 1
29+
tile_data = IntArray( 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, 65536, 1, 65537, 0, 65538, 0, 65539, 0, 65540, 1, 65541, 0, 65542, 0, 65543, 0, 65544, 0, 65545, 0, 65546, 0, 65547, 0, 65548, 1, 65549, 0, 65550, 0, 65551, 1, 131072, 1, 131073, 0, 131074, 0, 131075, 0, 131076, 1, 131077, 0, 131078, 0, 131079, 0, 131080, 0, 131081, 0, 131082, 0, 131083, 0, 131084, 1, 131085, 0, 131086, 0, 131087, 1, 196608, 1, 196609, 0, 196610, 0, 196611, 0, 196612, 1, 196613, 0, 196614, 0, 196615, 0, 196616, 0, 196617, 0, 196618, 0, 196619, 0, 196620, 1, 196621, 1, 196622, 1, 196623, 1, 262144, 1, 262145, 0, 262146, 0, 262147, 0, 262148, 1, 262149, 1, 262150, 1, 262151, 1, 262152, 1, 262153, 1, 262154, 0, 262155, 0, 262156, 1, 262157, 0, 262158, 0, 262159, 1, 327680, 1, 327681, 0, 327682, 0, 327683, 0, 327684, 1, 327685, 0, 327686, 0, 327687, 0, 327688, 0, 327689, 1, 327690, 0, 327691, 0, 327692, 1, 327693, 0, 327694, 0, 327695, 1, 393216, 1, 393217, 0, 393218, 0, 393219, 0, 393220, 1, 393221, 0, 393222, 0, 393223, 0, 393224, 0, 393225, 1, 393226, 0, 393227, 0, 393228, 1, 393229, 0, 393230, 0, 393231, 1, 458752, 1, 458753, 1, 458754, 1, 458755, 1, 458756, 1, 458757, 0, 458758, 0, 458759, 0, 458760, 0, 458761, 1, 458762, 1, 458763, 1, 458764, 1, 458765, 1, 458766, 1, 458767, 1, 524288, 1, 524289, 0, 524290, 0, 524291, 0, 524292, 1, 524293, 1, 524294, 1, 524295, 1, 524296, 1, 524297, 1, 524298, 0, 524299, 0, 524300, 0, 524301, 0, 524302, 0, 524303, 0, 589824, 1, 589825, 0, 589826, 0, 589827, 0, 589828, 0, 589829, 0, 589830, 0, 589831, 0, 589832, 0, 589833, 0, 589834, 0, 589835, 0, 589836, 0, 589837, 0, 589838, 0, 589839, 0 )
30+
31+
[node name="start_pos" type="Position2D" parent="."]
32+
33+
transform/pos = Vector2( 29.915, 568.605 )
34+
__meta__ = {
35+
"_edit_group_": true
36+
}
37+
38+
[node name="sprite" type="Sprite" parent="start_pos"]
39+
40+
texture = ExtResource( 3 )
41+
region = true
42+
region_rect = Rect2( 832, 768, 64, 64 )
43+
44+
[node name="end_pos" type="Position2D" parent="."]
45+
46+
transform/pos = Vector2( 994.048, 33.4137 )
47+
__meta__ = {
48+
"_edit_group_": true
49+
}
50+
51+
[node name="sprite" type="Sprite" parent="end_pos"]
52+
53+
texture = ExtResource( 3 )
54+
region = true
55+
region_rect = Rect2( 704, 768, 64, 64 )
56+
57+
[node name="mob_timer" type="Timer" parent="."]
58+
59+
process_mode = 1
60+
wait_time = 0.5
61+
one_shot = false
62+
autostart = true
63+
64+
[connection signal="timeout" from="mob_timer" to="." method="_on_mob_timer_timeout"]
65+
66+

One_Shots/nav/mob.gd

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
extends Sprite
2+
3+
var speed = 150
4+
var nav = null setget set_nav
5+
var path = []
6+
var goal = Vector2()
7+
8+
func _ready():
9+
set_fixed_process(true)
10+
11+
func set_nav(new_nav):
12+
nav = new_nav
13+
update_path()
14+
15+
func update_path():
16+
path = nav.get_simple_path(get_pos(), goal, false)
17+
if path.size() == 0:
18+
queue_free()
19+
20+
func _fixed_process(delta):
21+
if path.size() > 1:
22+
var d = get_pos().distance_to(path[0])
23+
if d > 2:
24+
set_pos(get_pos().linear_interpolate(path[0], (speed * delta)/d))
25+
else:
26+
path.remove(0)
27+
else:
28+
queue_free()

One_Shots/nav/mob.tscn

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[gd_scene load_steps=3 format=1]
2+
3+
[ext_resource path="res://towerDefense_tilesheet.tex" type="Texture" id=1]
4+
[ext_resource path="res://mob.gd" type="Script" id=2]
5+
6+
[node name="mob" type="Sprite"]
7+
8+
transform/pos = Vector2( 193.173, 280.237 )
9+
texture = ExtResource( 1 )
10+
region = true
11+
region_rect = Rect2( 976.49, 652.633, 32.5, 39 )
12+
script/script = ExtResource( 2 )
13+
14+

One_Shots/nav/tileset_grass_dirt.tres

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
[gd_resource type="TileSet" load_steps=3 format=1]
2+
3+
[ext_resource path="res://towerDefense_tilesheet.tex" type="Texture" id=1]
4+
5+
[sub_resource type="NavigationPolygon" id=1]
6+
7+
vertices = Vector2Array( 32, 32, -32, 32, -32, -32, 32, -32 )
8+
polygons = [ IntArray( 0, 1, 2, 3 ) ]
9+
outlines = [ Vector2Array( 32, -32, -32, -32, -32, 32, 32, 32 ) ]
10+
11+
[resource]
12+
13+
0/name = "Sprite 4"
14+
0/texture = ExtResource( 1 )
15+
0/tex_offset = Vector2( 0, 0 )
16+
0/modulate = Color( 1, 1, 1, 1 )
17+
0/region = Rect2( 64, 64, 64, 64 )
18+
0/occluder_offset = Vector2( 32, 32 )
19+
0/navigation_offset = Vector2( 32, 32 )
20+
0/shape_offset = Vector2( 0, 0 )
21+
0/shapes = [ ]
22+
1/name = "Sprite 14"
23+
1/texture = ExtResource( 1 )
24+
1/tex_offset = Vector2( 0, 0 )
25+
1/modulate = Color( 1, 1, 1, 1 )
26+
1/region = Rect2( 256, 128, 64, 64 )
27+
1/occluder_offset = Vector2( 32, 32 )
28+
1/navigation_offset = Vector2( 32, 32 )
29+
1/navigation = SubResource( 1 )
30+
1/shape_offset = Vector2( 0, 0 )
31+
1/shapes = [ ]
32+

One_Shots/nav/tileset_grass_dirt.tscn

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
[gd_scene load_steps=3 format=1]
2+
3+
[ext_resource path="res://towerDefense_tilesheet.tex" type="Texture" id=1]
4+
5+
[sub_resource type="NavigationPolygon" id=16]
6+
7+
vertices = Vector2Array( 32, 32, -32, 32, -32, -32, 32, -32 )
8+
polygons = [ IntArray( 0, 1, 2, 3 ) ]
9+
outlines = [ Vector2Array( 32, -32, -32, -32, -32, 32, 32, 32 ) ]
10+
11+
[node name="tileset_grass_dirt" type="Node2D"]
12+
13+
[node name="Sprite 4" type="Sprite" parent="."]
14+
15+
transform/pos = Vector2( 64, 64 )
16+
texture = ExtResource( 1 )
17+
region = true
18+
region_rect = Rect2( 64, 64, 64, 64 )
19+
20+
[node name="Sprite 14" type="Sprite" parent="."]
21+
22+
transform/pos = Vector2( 160, 64 )
23+
texture = ExtResource( 1 )
24+
region = true
25+
region_rect = Rect2( 256, 128, 64, 64 )
26+
__meta__ = {
27+
"_edit_group_": true
28+
}
29+
30+
[node name="NavigationPolygonInstance" type="NavigationPolygonInstance" parent="Sprite 14"]
31+
32+
navpoly = SubResource( 16 )
33+
enabled = true
34+
35+

0 commit comments

Comments
 (0)