extends Control const WS_URL := "ws://localhost:9090/ws" const MENU_SCENE := "res://scenes/menu.tscn" @onready var color_rect: ColorRect = $ColorRect @onready var target_rect: ColorRect = $UiLayer/TargetRect @onready var hint_label: Label = $UiLayer/HintLabel @onready var back_button: Button = $UiLayer/BackButton var _socket := WebSocketPeer.new() var _accel := Vector3i.ZERO var _target_hue := 0.0 func _ready() -> void: back_button.pressed.connect(_return_to_menu) _new_target_color() var err := _socket.connect_to_url(WS_URL) if err != OK: hint_label.text = "WebSocket connect failed: %s" % error_string(err) else: hint_label.text = "Neige das Gerät, um die Farbe anzupassen" func _return_to_menu() -> void: get_tree().change_scene_to_file(MENU_SCENE) func _new_target_color() -> void: _target_hue = randf() target_rect.color = Color.from_hsv(_target_hue, 0.75, 0.85) func _physics_process(_delta: float) -> void: _socket.poll() if _socket.get_ready_state() == WebSocketPeer.STATE_OPEN: while _socket.get_available_packet_count() > 0: var packet := _socket.get_packet().get_string_from_utf8() _handle_accel_message(packet) elif _socket.get_ready_state() == WebSocketPeer.STATE_CLOSED: _socket.connect_to_url(WS_URL) var hue := fmod(float(_accel.x) / 20000.0 + 1.0, 1.0) color_rect.color = Color.from_hsv(hue, 0.75, 0.85) var diff := absf(hue - _target_hue) diff = minf(diff, 1.0 - diff) if diff < 0.04: hint_label.text = "Treffer! Neues Ziel…" _new_target_color() else: hint_label.text = "Passe deine Farbe der Zielfarbe an (Neigung steuert den Farbton)" func _handle_accel_message(text: String) -> void: var data = JSON.parse_string(text) if typeof(data) != TYPE_DICTIONARY: return if data.get("type") != "accel" or not data.get("success", false): return if not data.has("x") or not data.has("y") or not data.has("z"): return _accel = Vector3i(int(data["x"]), int(data["y"]), int(data["z"]))