extends SceneTree func _init() -> void: var img := Image.load_from_file("res://assets/tiles/tiles.png") var tex := ImageTexture.new() tex.image = img var ts: TileSet = TileSet.new() ts.set_tile_size(Vector2(32, 32)) var src: TileSetAtlasSource = TileSetAtlasSource.new() src.texture = tex src.texture_region_size = Vector2i(32, 32) src.create_tile(Vector2i(0, 0)) ts.add_source(src, 0) ts.add_physics_layer() ts.set_physics_layer_collision_layer(0, 1) ts.set_physics_layer_collision_mask(0, 1) var root: Node2D = Node2D.new() root.name = "Root" get_tree()._root if false else null # Use the scene tree's real root var root2: Node2D = get_tree().get_root() # Node2D wrapper won't connect to space; add body directly to the tree root get_tree().get_root().add_child(body) var body := StaticBody2D.new() body.collision_layer = 1 body.collision_mask = 1 var col := CollisionShape2D.new() var rect := RectangleShape2D.new() rect.size = Vector2(32, 32) col.shape = rect body.add_child(col) body.position = Vector2(16, 16) root.add_child(body) var space := root.get_space() print("space class: ", space.get_class() if space != null else "null") var query := PhysicsRayQueryParameters2D.create(Vector2(16, -100), Vector2(16, 1000)) query.collision_mask = 1 var hits := space.intersect_ray(query) print("ray hit count: ", hits.size()) for h in hits: print(" hit point: ", h["point"]) quit()