extends Panel @onready var pos: Panel = $Pos @onready var label_node: RichTextLabel = $Label @onready var box_theme: StyleBoxFlat = preload("uid://bgb7rlf1chjnd") as StyleBoxFlat @export var axis_x: JoyAxis @export var axis_y: JoyAxis const DOT_OFFSET: float = 80.0 var _dot_style: StyleBoxFlat var _last_x := 0.0 var _last_y := 0.0 func _ready() -> void: self._dot_style = box_theme.duplicate() self.pos.add_theme_stylebox_override("panel", self._dot_style) self._dot_style.bg_color = Config.default_joystick_color.value var bg_color: Color = Config.default_joystick_color.value (self.get_theme_stylebox("panel") as StyleBoxFlat).border_color = bg_color func _process(_delta: float) -> void: var x := Input.get_joy_axis(0, self.axis_x) var y := Input.get_joy_axis(0, self.axis_y) self.pos.position.x = (x * 128.0) + DOT_OFFSET self.pos.position.y = (y * 128.0) + DOT_OFFSET var speed_x: float = abs(x - self._last_x) var speed_y: float = abs(y - self._last_y) var is_moving: bool = speed_x > WyHelper.DRIFT_DEADZONE || speed_y > WyHelper.DRIFT_DEADZONE var is_drifting: bool = !is_moving && (speed_x > WyHelper.REST_DEADZONE || speed_y > WyHelper.REST_DEADZONE) var is_stuck: bool = (abs(x) > WyHelper.DRIFT_DEADZONE && abs(x) <= WyHelper.STUCK_DEADZONE) \ && (abs(y) > WyHelper.DRIFT_DEADZONE && abs(y) <= WyHelper.STUCK_DEADZONE) if Config.track_joystick_movement.value && is_moving: self._dot_style.bg_color = Config.active_color.value elif Config.track_joystick_drift.value && (is_drifting || is_stuck): self._dot_style.bg_color = WyHelper.ERROR_COLOR else: self._dot_style.bg_color = Config.default_joystick_color.value if Config.joystick_labels.value: self.label_node.text = "x:%0.2f y:%0.2f" % [x, y] self._last_x = x self._last_y = y