From f32dd932f68b774f84c26c9c121bf8fe70c16813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerard=20Gasc=C3=B3n?= Date: Fri, 4 Apr 2025 16:06:01 +0200 Subject: [PATCH] fix: proper window instantiation position calculation --- scenes/main.gd | 2 +- src/dragon_instantiator.gd | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/scenes/main.gd b/scenes/main.gd index 16ea676..fa77b2b 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -8,7 +8,7 @@ var _instantiator: DragonInstantiator func _ready(): - _instantiator = DragonInstantiator.new(dragon_template, dragon_spots) + _instantiator = DragonInstantiator.new(dragon_template, dragon_spots, get_viewport(), get_window()) await get_tree().process_frame move_window_to_bottom_right() diff --git a/src/dragon_instantiator.gd b/src/dragon_instantiator.gd index ca8813e..e6cb9db 100644 --- a/src/dragon_instantiator.gd +++ b/src/dragon_instantiator.gd @@ -2,16 +2,30 @@ class_name DragonInstantiator var _dragon_template: PackedScene var _positions: Array[Vector2i] = [] +var _viewport: Viewport +var _window: Window -func _init(dragon: PackedScene, positions: Array[Node2D]) -> void: +func _init(dragon: PackedScene, positions: Array[Node2D], viewport: Viewport, window: Window) -> void: + _window = window + _viewport = viewport _dragon_template = dragon for pos in positions: _positions.push_back((Vector2i)(pos.position)) func instantiate() -> Node: - var position: Vector2i = _positions[0] - return _instantiate_dragon(position) + var position: Vector2 = _positions[0] + var relative_position: Vector2i = _calculate_relative_position(position) + return _instantiate_dragon(relative_position) + + +func _calculate_relative_position(position: Vector2) -> Vector2i: + var viewport_size: Vector2 = _viewport.get_texture().get_size() + var window_size: Vector2 = _window.get_size_with_decorations() + + var scale: Vector2 = window_size / viewport_size + + return Vector2i(Vector2(position) * scale) func _instantiate_dragon(relative_position: Vector2i) -> Node: