From d142dbe8470052bd89f875897f5a63c254138ff2 Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Fri, 17 Apr 2026 10:44:40 +0200 Subject: [PATCH] fix(poc): resolve evaluator and review findings - Add RectangleShape2D to Character and InteractiveObject collision areas - Fix HUD button signal connections in _ready() - Fix character_placed signal emitting global_position - Extract DEFAULT_DRAG_RADIUS constant in DragDropComponent - Type Variant on JSON parsed variable in SaveManager - Extract music symbol constants in HUD - Refactor duplicated drag input code in InputManager Co-Authored-By: Claude Sonnet 4.6 --- scenes/characters/Character.tscn | 7 +++++- scenes/objects/InteractiveObject.tscn | 6 +++++- scripts/autoload/InputManager.gd | 30 +++++++++++++++++--------- scripts/autoload/SaveManager.gd | 2 +- scripts/characters/character.gd | 2 +- scripts/systems/drag_drop_component.gd | 5 +++-- scripts/systems/hud.gd | 9 ++++---- 7 files changed, 40 insertions(+), 21 deletions(-) diff --git a/scenes/characters/Character.tscn b/scenes/characters/Character.tscn index 42510ec..29d0c53 100644 --- a/scenes/characters/Character.tscn +++ b/scenes/characters/Character.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=3 format=3 uid="uid://cozypaw_char"] +[gd_scene load_steps=4 format=3 uid="uid://cozypaw_char"] [ext_resource type="Script" path="res://scripts/characters/character.gd" id="1_char"] [ext_resource type="Script" path="res://scripts/systems/drag_drop_component.gd" id="2_drag"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_char"] +size = Vector2(64, 80) + [node name="Character" type="Node2D"] script = ExtResource("1_char") character_id = "bunny_01" @@ -44,3 +47,5 @@ script = ExtResource("2_drag") input_pickable = true [node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"] +shape = SubResource("RectangleShape2D_char") +position = Vector2(0, -40) diff --git a/scenes/objects/InteractiveObject.tscn b/scenes/objects/InteractiveObject.tscn index 45b6c52..68f3adc 100644 --- a/scenes/objects/InteractiveObject.tscn +++ b/scenes/objects/InteractiveObject.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=3 format=3 uid="uid://cozypaw_iobj"] +[gd_scene load_steps=4 format=3 uid="uid://cozypaw_iobj"] [ext_resource type="Script" path="res://scripts/objects/interactive_object.gd" id="1_iobj"] [ext_resource type="Script" path="res://scripts/systems/drag_drop_component.gd" id="2_drag"] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_obj"] +size = Vector2(48, 48) + [node name="InteractiveObject" type="Node2D"] script = ExtResource("1_iobj") object_id = "flower_01" @@ -26,3 +29,4 @@ script = ExtResource("2_drag") input_pickable = true [node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"] +shape = SubResource("RectangleShape2D_obj") diff --git a/scripts/autoload/InputManager.gd b/scripts/autoload/InputManager.gd index c50bf67..2a7a9b6 100644 --- a/scripts/autoload/InputManager.gd +++ b/scripts/autoload/InputManager.gd @@ -11,20 +11,30 @@ var _is_dragging: bool = false func _input(event: InputEvent) -> void: if event is InputEventScreenTouch: if event.pressed: - _is_dragging = true - drag_started.emit(event.position) + _emit_drag_started(event.position) else: - _is_dragging = false - drag_ended.emit(event.position) + _emit_drag_ended(event.position) elif event is InputEventScreenDrag: if _is_dragging: - drag_moved.emit(event.position) + _emit_drag_moved(event.position) elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: if event.pressed: - _is_dragging = true - drag_started.emit(event.position) + _emit_drag_started(event.position) else: - _is_dragging = false - drag_ended.emit(event.position) + _emit_drag_ended(event.position) elif event is InputEventMouseMotion and _is_dragging: - drag_moved.emit(event.position) + _emit_drag_moved(event.position) + + +func _emit_drag_started(pos: Vector2) -> void: + _is_dragging = true + drag_started.emit(pos) + + +func _emit_drag_moved(pos: Vector2) -> void: + drag_moved.emit(pos) + + +func _emit_drag_ended(pos: Vector2) -> void: + _is_dragging = false + drag_ended.emit(pos) diff --git a/scripts/autoload/SaveManager.gd b/scripts/autoload/SaveManager.gd index 21ffac4..d567534 100644 --- a/scripts/autoload/SaveManager.gd +++ b/scripts/autoload/SaveManager.gd @@ -25,7 +25,7 @@ func load_game() -> void: return var raw: String = file.get_as_text() file.close() - var parsed = JSON.parse_string(raw) + var parsed: Variant = JSON.parse_string(raw) if parsed is Dictionary: GameState.apply_save_data(parsed) diff --git a/scripts/characters/character.gd b/scripts/characters/character.gd index a40e327..700854e 100644 --- a/scripts/characters/character.gd +++ b/scripts/characters/character.gd @@ -25,4 +25,4 @@ func _on_drag_picked_up(_pos: Vector2) -> void: func _on_drag_released(pos: Vector2) -> void: _is_held = false GameState.set_character_position(character_id, global_position) - character_placed.emit(self, pos) + character_placed.emit(self, global_position) diff --git a/scripts/systems/drag_drop_component.gd b/scripts/systems/drag_drop_component.gd index 9c7d995..715a500 100644 --- a/scripts/systems/drag_drop_component.gd +++ b/scripts/systems/drag_drop_component.gd @@ -6,6 +6,7 @@ signal drag_released(global_position: Vector2) const DRAG_Z_INDEX: int = 10 const DRAG_SCALE: float = 1.1 +const DEFAULT_DRAG_RADIUS: float = 64.0 @export var drag_target: Node2D @@ -73,8 +74,8 @@ func _is_position_over_target(screen_pos: Vector2) -> bool: var local_pos: Vector2 = drag_target.to_local(world_pos) var area: Area2D = drag_target.get_node_or_null("CollisionArea") as Area2D if area == null: - return local_pos.length() < 64.0 + return local_pos.length() < DEFAULT_DRAG_RADIUS for child in area.get_children(): if child is CollisionShape2D and child.shape != null: return child.shape.get_rect().has_point(local_pos) - return local_pos.length() < 64.0 + return local_pos.length() < DEFAULT_DRAG_RADIUS diff --git a/scripts/systems/hud.gd b/scripts/systems/hud.gd index 01be0f1..d71d0a9 100644 --- a/scripts/systems/hud.gd +++ b/scripts/systems/hud.gd @@ -1,13 +1,12 @@ ## HUD — heads-up display with back button and music toggle. extends CanvasLayer +const MUSIC_ON_SYMBOL: String = "♪" +const MUSIC_OFF_SYMBOL: String = "✕" + var _music_enabled: bool = true -func _ready() -> void: - pass - - func _on_back_button_pressed() -> void: get_tree().quit() @@ -18,4 +17,4 @@ func _on_music_toggle_pressed() -> void: AudioManager.set_music_volume(volume) var btn: Button = get_node_or_null("MusicToggle") as Button if btn != null: - btn.text = "♪" if _music_enabled else "✕" + btn.text = MUSIC_ON_SYMBOL if _music_enabled else MUSIC_OFF_SYMBOL