demo-game/scripts/color_game.gd
simon 84827c9782 Add main menu, WebSocket API demo, and multi-scene game hub.
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>
2026-05-29 21:43:44 +02:00

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"]))