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 <noreply@anthropic.com>
This commit is contained in:
Steven Wroblewski
2026-04-17 10:44:40 +02:00
parent 22f4bea670
commit d142dbe847
7 changed files with 40 additions and 21 deletions

View File

@@ -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/characters/character.gd" id="1_char"]
[ext_resource type="Script" path="res://scripts/systems/drag_drop_component.gd" id="2_drag"] [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"] [node name="Character" type="Node2D"]
script = ExtResource("1_char") script = ExtResource("1_char")
character_id = "bunny_01" character_id = "bunny_01"
@@ -44,3 +47,5 @@ script = ExtResource("2_drag")
input_pickable = true input_pickable = true
[node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"] [node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"]
shape = SubResource("RectangleShape2D_char")
position = Vector2(0, -40)

View File

@@ -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/objects/interactive_object.gd" id="1_iobj"]
[ext_resource type="Script" path="res://scripts/systems/drag_drop_component.gd" id="2_drag"] [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"] [node name="InteractiveObject" type="Node2D"]
script = ExtResource("1_iobj") script = ExtResource("1_iobj")
object_id = "flower_01" object_id = "flower_01"
@@ -26,3 +29,4 @@ script = ExtResource("2_drag")
input_pickable = true input_pickable = true
[node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"] [node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"]
shape = SubResource("RectangleShape2D_obj")

View File

@@ -11,20 +11,30 @@ var _is_dragging: bool = false
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventScreenTouch: if event is InputEventScreenTouch:
if event.pressed: if event.pressed:
_is_dragging = true _emit_drag_started(event.position)
drag_started.emit(event.position)
else: else:
_is_dragging = false _emit_drag_ended(event.position)
drag_ended.emit(event.position)
elif event is InputEventScreenDrag: elif event is InputEventScreenDrag:
if _is_dragging: if _is_dragging:
drag_moved.emit(event.position) _emit_drag_moved(event.position)
elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed: if event.pressed:
_is_dragging = true _emit_drag_started(event.position)
drag_started.emit(event.position)
else: else:
_is_dragging = false _emit_drag_ended(event.position)
drag_ended.emit(event.position)
elif event is InputEventMouseMotion and _is_dragging: 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)

View File

@@ -25,7 +25,7 @@ func load_game() -> void:
return return
var raw: String = file.get_as_text() var raw: String = file.get_as_text()
file.close() file.close()
var parsed = JSON.parse_string(raw) var parsed: Variant = JSON.parse_string(raw)
if parsed is Dictionary: if parsed is Dictionary:
GameState.apply_save_data(parsed) GameState.apply_save_data(parsed)

View File

@@ -25,4 +25,4 @@ func _on_drag_picked_up(_pos: Vector2) -> void:
func _on_drag_released(pos: Vector2) -> void: func _on_drag_released(pos: Vector2) -> void:
_is_held = false _is_held = false
GameState.set_character_position(character_id, global_position) GameState.set_character_position(character_id, global_position)
character_placed.emit(self, pos) character_placed.emit(self, global_position)

View File

@@ -6,6 +6,7 @@ signal drag_released(global_position: Vector2)
const DRAG_Z_INDEX: int = 10 const DRAG_Z_INDEX: int = 10
const DRAG_SCALE: float = 1.1 const DRAG_SCALE: float = 1.1
const DEFAULT_DRAG_RADIUS: float = 64.0
@export var drag_target: Node2D @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 local_pos: Vector2 = drag_target.to_local(world_pos)
var area: Area2D = drag_target.get_node_or_null("CollisionArea") as Area2D var area: Area2D = drag_target.get_node_or_null("CollisionArea") as Area2D
if area == null: if area == null:
return local_pos.length() < 64.0 return local_pos.length() < DEFAULT_DRAG_RADIUS
for child in area.get_children(): for child in area.get_children():
if child is CollisionShape2D and child.shape != null: if child is CollisionShape2D and child.shape != null:
return child.shape.get_rect().has_point(local_pos) return child.shape.get_rect().has_point(local_pos)
return local_pos.length() < 64.0 return local_pos.length() < DEFAULT_DRAG_RADIUS

View File

@@ -1,13 +1,12 @@
## HUD — heads-up display with back button and music toggle. ## HUD — heads-up display with back button and music toggle.
extends CanvasLayer extends CanvasLayer
const MUSIC_ON_SYMBOL: String = ""
const MUSIC_OFF_SYMBOL: String = ""
var _music_enabled: bool = true var _music_enabled: bool = true
func _ready() -> void:
pass
func _on_back_button_pressed() -> void: func _on_back_button_pressed() -> void:
get_tree().quit() get_tree().quit()
@@ -18,4 +17,4 @@ func _on_music_toggle_pressed() -> void:
AudioManager.set_music_volume(volume) AudioManager.set_music_volume(volume)
var btn: Button = get_node_or_null("MusicToggle") as Button var btn: Button = get_node_or_null("MusicToggle") as Button
if btn != null: if btn != null:
btn.text = "" if _music_enabled else "" btn.text = MUSIC_ON_SYMBOL if _music_enabled else MUSIC_OFF_SYMBOL