Skip to content

Commit 5f8a917

Browse files
committed
Add dynamic TileMap layer demo
1 parent 1113baf commit 5f8a917

14 files changed

+336
-0
lines changed

2d/dynamic_tilemap_layers/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Dynamic TileMap Layers
2+
3+
Example of how to make a fake wall using TileMap's
4+
`_tile_data_runtime_update()` method. It shows how
5+
to disable collisions per layer.
6+
7+
Language: GDScript
8+
9+
Renderer: OpenGL
10+
11+
## Screenshots
12+
13+
![Screenshot](screenshots/fake_wall.png)

2d/dynamic_tilemap_layers/icon.png

4.28 KB
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://bpov140lx7at3"
6+
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://icon.png"
14+
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
extends TileMap
2+
3+
var secret_layer: int # You can have multiple layers if you make this an array.
4+
var player_in_secret: bool
5+
var layer_alpha := 1.0
6+
7+
func _init() -> void:
8+
for i in get_layers_count(): # Find the secret layer by name.
9+
if get_layer_name(i) == "Secret":
10+
secret_layer = i
11+
12+
func _ready() -> void:
13+
set_process(false)
14+
15+
func _process(delta: float) -> void:
16+
if player_in_secret:
17+
if layer_alpha > 0.3:
18+
layer_alpha = move_toward(layer_alpha, 0.3, delta) # Animate the layer transparency.
19+
set_layer_modulate(secret_layer, Color(1, 1, 1, layer_alpha))
20+
else:
21+
set_process(false)
22+
else:
23+
if layer_alpha < 1.0:
24+
layer_alpha = move_toward(layer_alpha, 1.0, delta)
25+
set_layer_modulate(secret_layer, Color(1, 1, 1, layer_alpha))
26+
else:
27+
set_process(false)
28+
29+
func _use_tile_data_runtime_update(layer: int, _coords: Vector2i) -> bool:
30+
if layer == secret_layer:
31+
return true
32+
return false
33+
34+
func _tile_data_runtime_update(_layer: int, _coords: Vector2i, tile_data: TileData) -> void:
35+
tile_data.set_collision_polygons_count(0, 0) # Remove collision for secret layer.
36+
37+
func _on_secret_detector_body_entered(body: Node2D) -> void:
38+
if not body is CharacterBody2D: # Detect player only.
39+
return
40+
41+
player_in_secret = true
42+
set_process(true)
43+
44+
func _on_secret_detector_body_exited(body: Node2D) -> void:
45+
if not body is CharacterBody2D:
46+
return
47+
48+
player_in_secret = false
49+
set_process(true)
1.81 KB
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://cs8h2qyuakmko"
6+
path="res://.godot/imported/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://level/obstacle.png"
14+
dest_files=["res://.godot/imported/obstacle.png-06287f6b2d26dd03335fd87ab78c2cc2.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
extends CharacterBody2D
2+
3+
const WALK_FORCE = 600
4+
const WALK_MAX_SPEED = 200
5+
const STOP_FORCE = 1300
6+
const JUMP_SPEED = 200
7+
8+
@onready var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
9+
10+
func _physics_process(delta):
11+
# Horizontal movement code. First, get the player's input.
12+
var walk = WALK_FORCE * (Input.get_axis(&"move_left", &"move_right"))
13+
# Slow down the player if they're not trying to move.
14+
if abs(walk) < WALK_FORCE * 0.2:
15+
# The velocity, slowed down a bit, and then reassigned.
16+
velocity.x = move_toward(velocity.x, 0, STOP_FORCE * delta)
17+
else:
18+
velocity.x += walk * delta
19+
# Clamp to the maximum horizontal movement speed.
20+
velocity.x = clamp(velocity.x, -WALK_MAX_SPEED, WALK_MAX_SPEED)
21+
22+
# Vertical movement code. Apply gravity.
23+
velocity.y += gravity * delta
24+
25+
# Move based on the velocity and snap to the ground.
26+
# TODO: This information should be set to the CharacterBody properties instead of arguments: snap, Vector2.DOWN, Vector2.UP
27+
# TODO: Rename velocity to linear_velocity in the rest of the script.
28+
move_and_slide()
29+
30+
# Check for jumping. is_on_floor() must be called after movement code.
31+
if is_on_floor() and Input.is_action_just_pressed(&"jump"):
32+
velocity.y = -JUMP_SPEED
502 Bytes
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://dfb8rr2fakwgp"
6+
path="res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://player/player.png"
14+
dest_files=["res://.godot/imported/player.png-1ad27fc2a62fa126eae918723933dd6f.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[gd_scene load_steps=4 format=2]
2+
3+
[ext_resource path="res://player/player.gd" type="Script" id=1]
4+
[ext_resource path="res://player/player.png" type="Texture2D" id=2]
5+
6+
[sub_resource type="RectangleShape2D" id=1]
7+
extents = Vector2(7, 7)
8+
9+
[node name="Player" type="CharacterBody2D"]
10+
script = ExtResource( 1 )
11+
12+
[node name="Sprite2D" type="Sprite2D" parent="."]
13+
texture = ExtResource( 2 )
14+
15+
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
16+
position = Vector2(-0.315559, 0.157784)
17+
shape = SubResource( 1 )
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
; Engine configuration file.
2+
; It's best edited using the editor UI and not directly,
3+
; since the parameters that go here are not all obvious.
4+
;
5+
; Format:
6+
; [section] ; section goes between []
7+
; param=value ; assign values to parameters
8+
9+
config_version=5
10+
11+
[application]
12+
13+
config/name="Dynamic TileMap Layers"
14+
config/description="Example of how to make a kinematic character controller in 2D using
15+
CharacterBody2D. The character moves around, is affected by moving
16+
platforms, can jump through one-way collision platforms, etc."
17+
run/main_scene="res://world.tscn"
18+
config/features=PackedStringArray("4.2")
19+
config/icon="res://icon.png"
20+
21+
[display]
22+
23+
window/size/viewport_width=530
24+
window/size/viewport_height=495
25+
window/stretch/mode="canvas_items"
26+
window/stretch/aspect="expand"
27+
28+
[input]
29+
30+
jump={
31+
"deadzone": 0.5,
32+
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
33+
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
34+
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
35+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
36+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"echo":false,"script":null)
37+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
38+
]
39+
}
40+
move_left={
41+
"deadzone": 0.5,
42+
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
43+
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
44+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"echo":false,"script":null)
45+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
46+
]
47+
}
48+
move_right={
49+
"deadzone": 0.5,
50+
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
51+
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
52+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"echo":false,"script":null)
53+
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
54+
]
55+
}
56+
57+
[physics]
58+
59+
common/physics_ticks_per_second=120
60+
2d/default_gravity=500
61+
62+
[rendering]
63+
64+
renderer/rendering_method="gl_compatibility"
65+
environment/defaults/default_clear_color=Color(0.156863, 0.133333, 0.25098, 1)
66+
anti_aliasing/quality/msaa_2d=2

2d/dynamic_tilemap_layers/screenshots/.gdignore

Whitespace-only changes.
Loading

2d/dynamic_tilemap_layers/world.tscn

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
[gd_scene load_steps=8 format=3 uid="uid://de7qapkqfycxl"]
2+
3+
[ext_resource type="Texture2D" uid="uid://cs8h2qyuakmko" path="res://level/obstacle.png" id="2"]
4+
[ext_resource type="Script" path="res://level/TileMap.gd" id="2_6gpyy"]
5+
[ext_resource type="PackedScene" path="res://player/player.tscn" id="3"]
6+
7+
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_on5ov"]
8+
9+
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_vnjib"]
10+
texture = ExtResource("2")
11+
0:0/0 = 0
12+
0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13+
0:0/0/physics_layer_0/angular_velocity = 0.0
14+
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
15+
1:0/0 = 0
16+
1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17+
1:0/0/physics_layer_0/angular_velocity = 0.0
18+
19+
[sub_resource type="TileSet" id="TileSet_xqlka"]
20+
physics_layer_0/collision_layer = 1
21+
physics_layer_0/physics_material = SubResource("PhysicsMaterial_on5ov")
22+
sources/0 = SubResource("TileSetAtlasSource_vnjib")
23+
24+
[sub_resource type="RectangleShape2D" id="RectangleShape2D_a2gec"]
25+
size = Vector2(112, 48)
26+
27+
[node name="World" type="Node2D"]
28+
29+
[node name="TileMap" type="TileMap" parent="."]
30+
z_index = 1
31+
tile_set = SubResource("TileSet_xqlka")
32+
format = 2
33+
layer_0/name = "Ground"
34+
layer_0/tile_data = PackedInt32Array(0, 0, 0, 65536, 0, 0, 131072, 0, 0, 196608, 0, 0, 262144, 0, 0, 327680, 0, 0, 393216, 0, 0, 458752, 0, 0, 524288, 0, 0, 589824, 0, 0, 655360, 0, 0, 720896, 0, 0, 786432, 0, 0, 851968, 0, 0, 917504, 0, 0, 983040, 0, 0, 1048576, 0, 0, 1114112, 0, 0, 1179648, 0, 0, 1245184, 0, 0, 1310720, 0, 0, 1376256, 0, 0, 1441792, 0, 0, 1507328, 0, 0, 1572864, 0, 0, 1638400, 0, 0, 1703936, 0, 0, 1769472, 0, 0, 1835008, 0, 0, 1900544, 0, 0, 1966080, 0, 0, 1, 0, 0, 65537, 0, 0, 131073, 0, 0, 196609, 0, 0, 262145, 0, 0, 327681, 0, 0, 393217, 0, 0, 458753, 0, 0, 524289, 0, 0, 589825, 0, 0, 655361, 0, 0, 720897, 0, 0, 786433, 0, 0, 851969, 0, 0, 917505, 0, 0, 983041, 0, 0, 1048577, 0, 0, 1114113, 0, 0, 1179649, 0, 0, 1245185, 0, 0, 1310721, 0, 0, 1376257, 0, 0, 1441793, 0, 0, 1507329, 0, 0, 1572865, 0, 0, 1638401, 0, 0, 1703937, 0, 0, 1769473, 0, 0, 1835009, 0, 0, 1900545, 0, 0, 1966081, 0, 0, 2, 0, 0, 65538, 0, 0, 1900546, 0, 0, 1966082, 0, 0, 3, 0, 0, 65539, 0, 0, 1900547, 0, 0, 1966083, 0, 0, 4, 0, 0, 65540, 0, 0, 1900548, 0, 0, 1966084, 0, 0, 5, 0, 0, 65541, 0, 0, 1900549, 0, 0, 1966085, 0, 0, 6, 0, 0, 65542, 0, 0, 1900550, 0, 0, 1966086, 0, 0, 7, 0, 0, 65543, 0, 0, 1900551, 0, 0, 1966087, 0, 0, 8, 0, 0, 65544, 0, 0, 1900552, 0, 0, 1966088, 0, 0, 9, 0, 0, 65545, 0, 0, 1900553, 0, 0, 1966089, 0, 0, 10, 0, 0, 65546, 0, 0, 1900554, 0, 0, 1966090, 0, 0, 11, 0, 0, 65547, 0, 0, 1900555, 0, 0, 1966091, 0, 0, 12, 0, 0, 65548, 0, 0, 1900556, 0, 0, 1966092, 0, 0, 13, 0, 0, 65549, 0, 0, 1900557, 0, 0, 1966093, 0, 0, 14, 0, 0, 65550, 0, 0, 1900558, 0, 0, 1966094, 0, 0, 15, 0, 0, 65551, 0, 0, 1900559, 0, 0, 1966095, 0, 0, 16, 0, 0, 65552, 0, 0, 1900560, 0, 0, 1966096, 0, 0, 17, 0, 0, 65553, 0, 0, 1900561, 0, 0, 1966097, 0, 0, 18, 0, 0, 65554, 0, 0, 1900562, 0, 0, 1966098, 0, 0, 19, 0, 0, 65555, 0, 0, 1900563, 0, 0, 1966099, 0, 0, 20, 0, 0, 65556, 0, 0, 1900564, 0, 0, 1966100, 0, 0, 21, 0, 0, 65557, 0, 0, 1900565, 0, 0, 1966101, 0, 0, 22, 0, 0, 65558, 0, 0, 1900566, 0, 0, 1966102, 0, 0, 23, 0, 0, 65559, 0, 0, 1900567, 0, 0, 1966103, 0, 0, 24, 0, 0, 65560, 0, 0, 1900568, 0, 0, 1966104, 0, 0, 25, 0, 0, 65561, 0, 0, 1900569, 0, 0, 1966105, 0, 0, 26, 0, 0, 65562, 0, 0, 1900570, 0, 0, 1966106, 0, 0, 27, 0, 0, 65563, 0, 0, 1900571, 0, 0, 1966107, 0, 0, 28, 0, 0, 65564, 0, 0, 1900572, 0, 0, 1966108, 0, 0, 29, 0, 0, 65565, 0, 0, 1900573, 0, 0, 1966109, 0, 0, 30, 0, 0, 65566, 0, 0, 1900574, 0, 0, 1966110, 0, 0, 31, 0, 0, 65567, 0, 0, 131103, 0, 0, 196639, 0, 0, 262175, 0, 0, 327711, 0, 0, 393247, 0, 0, 458783, 0, 0, 524319, 0, 0, 589855, 0, 0, 655391, 0, 0, 720927, 0, 0, 786463, 0, 0, 851999, 0, 0, 917535, 0, 0, 983071, 0, 0, 1048607, 0, 0, 1114143, 0, 0, 1179679, 0, 0, 1245215, 0, 0, 1310751, 0, 0, 1376287, 0, 0, 1441823, 0, 0, 1507359, 0, 0, 1572895, 0, 0, 1638431, 0, 0, 1703967, 0, 0, 1769503, 0, 0, 1835039, 0, 0, 1900575, 0, 0, 1966111, 0, 0, 32, 0, 0, 65568, 0, 0, 131104, 0, 0, 196640, 0, 0, 262176, 0, 0, 327712, 0, 0, 393248, 0, 0, 458784, 0, 0, 524320, 0, 0, 589856, 0, 0, 655392, 0, 0, 720928, 0, 0, 786464, 0, 0, 852000, 0, 0, 917536, 0, 0, 983072, 0, 0, 1048608, 0, 0, 1114144, 0, 0, 1179680, 0, 0, 1245216, 0, 0, 1310752, 0, 0, 1376288, 0, 0, 1441824, 0, 0, 1507360, 0, 0, 1572896, 0, 0, 1638432, 0, 0, 1703968, 0, 0, 1769504, 0, 0, 1835040, 0, 0, 1900576, 0, 0, 1966112, 0, 0, 1572878, 0, 0, 1572879, 0, 0, 1572880, 0, 0, 1572881, 0, 0, 1572882, 0, 0, 1572883, 0, 0, 1572884, 0, 0, 1507348, 0, 0, 1441812, 0, 0, 1441811, 0, 0, 1441810, 0, 0, 1441809, 0, 0, 1441808, 0, 0, 1441807, 0, 0, 1441806, 0, 0, 1507342, 0, 0, 1507343, 0, 0, 1507344, 0, 0, 1507345, 0, 0, 1507346, 0, 0, 1507347, 0, 0, 1638414, 0, 0, 1638415, 0, 0, 1638416, 0, 0, 1638417, 0, 0, 1638418, 0, 0, 1638419, 0, 0, 1638420, 0, 0)
35+
layer_1/name = "Secret"
36+
layer_1/enabled = true
37+
layer_1/modulate = Color(1, 1, 1, 1)
38+
layer_1/y_sort_enabled = false
39+
layer_1/y_sort_origin = 0
40+
layer_1/z_index = 0
41+
layer_1/tile_data = PackedInt32Array(1703950, 0, 0, 1769486, 0, 0, 1835022, 0, 0, 1703951, 0, 0, 1769487, 0, 0, 1835023, 0, 0, 1703952, 0, 0, 1769488, 0, 0, 1835024, 0, 0, 1703953, 0, 0, 1769489, 0, 0, 1835025, 0, 0, 1703954, 0, 0, 1769490, 0, 0, 1835026, 0, 0, 1703955, 0, 0, 1769491, 0, 0, 1835027, 0, 0, 1703956, 0, 0, 1769492, 0, 0, 1835028, 0, 0)
42+
script = ExtResource("2_6gpyy")
43+
44+
[node name="Camera2D" type="Camera2D" parent="."]
45+
offset = Vector2(265, 247)
46+
47+
[node name="Player" parent="." instance=ExtResource("3")]
48+
position = Vector2(120, 456)
49+
50+
[node name="SecretDetector" type="Area2D" parent="."]
51+
position = Vector2(280, 440)
52+
53+
[node name="CollisionShape2D" type="CollisionShape2D" parent="SecretDetector"]
54+
shape = SubResource("RectangleShape2D_a2gec")
55+
56+
[connection signal="body_entered" from="SecretDetector" to="TileMap" method="_on_secret_detector_body_entered"]
57+
[connection signal="body_exited" from="SecretDetector" to="TileMap" method="_on_secret_detector_body_exited"]

0 commit comments

Comments
 (0)