gamo-gd/controller/joystick/joystick.gd

51 lines
1.7 KiB
GDScript

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