feat(poc): implement Sprint 1 proof of concept
- project.godot with autoload configuration - Reception room with placeholder visuals - Draggable Character with DragDropComponent - Interactive flower object with bounce animation - GameState, SaveManager, AudioManager, InputManager autoloads - HUD with back button and music toggle Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
57
scripts/objects/interactive_object.gd
Normal file
57
scripts/objects/interactive_object.gd
Normal file
@@ -0,0 +1,57 @@
|
||||
## InteractiveObject — base class for all interactive room objects (flowers, equipment, etc.).
|
||||
class_name InteractiveObject extends Node2D
|
||||
|
||||
signal object_interacted(object: InteractiveObject)
|
||||
|
||||
enum State { IDLE, ACTIVE, RETURNING }
|
||||
|
||||
@export var object_id: String = ""
|
||||
|
||||
var _current_state: State = State.IDLE
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var drag: DragDropComponent = get_node_or_null("DragDropComponent") as DragDropComponent
|
||||
if drag != null:
|
||||
drag.drag_picked_up.connect(_on_drag_picked_up)
|
||||
drag.drag_released.connect(_on_drag_released)
|
||||
var area: Area2D = get_node_or_null("CollisionArea") as Area2D
|
||||
if area != null:
|
||||
area.input_event.connect(_on_area_input_event)
|
||||
|
||||
|
||||
func _on_drag_picked_up(_pos: Vector2) -> void:
|
||||
_set_state(State.ACTIVE)
|
||||
object_interacted.emit(self)
|
||||
|
||||
|
||||
func _on_drag_released(_pos: Vector2) -> void:
|
||||
_set_state(State.RETURNING)
|
||||
GameState.set_object_state(object_id, "idle")
|
||||
_play_bounce_animation()
|
||||
|
||||
|
||||
func _on_area_input_event(_viewport: Node, event: InputEvent, _shape_idx: int) -> void:
|
||||
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
|
||||
_trigger_interaction()
|
||||
elif event is InputEventScreenTouch and event.pressed:
|
||||
_trigger_interaction()
|
||||
|
||||
|
||||
func _trigger_interaction() -> void:
|
||||
_set_state(State.ACTIVE)
|
||||
object_interacted.emit(self)
|
||||
GameState.set_object_state(object_id, "active")
|
||||
_play_bounce_animation()
|
||||
|
||||
|
||||
func _set_state(new_state: State) -> void:
|
||||
_current_state = new_state
|
||||
|
||||
|
||||
func _play_bounce_animation() -> void:
|
||||
var tween: Tween = create_tween()
|
||||
tween.tween_property(self, "scale", Vector2(1.2, 1.2), 0.1)
|
||||
tween.tween_property(self, "scale", Vector2(0.9, 0.9), 0.1)
|
||||
tween.tween_property(self, "scale", Vector2(1.0, 1.0), 0.1)
|
||||
tween.tween_callback(func() -> void: _set_state(State.IDLE))
|
||||
Reference in New Issue
Block a user