51 lines
1.7 KiB
GDScript
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
|