Replace the single-entry Pong flow with a menu launcher, a per-client API demo on :8081/ws with stream controls and tap flash feedback, and bump the viewport to 1920×1080. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.9 KiB
GDScript
67 lines
1.9 KiB
GDScript
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"]))
|