extends Panel @onready var talk_a_texture: CompressedTexture2D = preload("res://assets/textures/Xbox Series/Vector/xbox_button_a.svg") @onready var drag_texture: CompressedTexture2D = preload("res://assets/textures/Generic/Vector/generic_button_circle.svg") @onready var thumbstick: TextureRect = %Thumbstick var thumbstick_size_factor: float = 0.5 var middle: Vector2 = Vector2(100, 100) var touch_start: Vector2 = Vector2(0, 0) var jump_threshold: float = 10.0 var delta: float = 0.0 var pressed: bool = false # debug rotation var rotation_delta: Vector2 = Vector2(0, 0) func _ready() -> void: #thumbstick.custom_minimum_size = Vector2(size.x, size.x) * thumbstick_size_factor thumbstick.position = middle - thumbstick.size / 2.0 func _on_gui_input(event: InputEvent) -> void: if event is not InputEventScreenTouch and event is not InputEventScreenDrag: return if event.is_pressed() == false: simulate_joystick_motion(JOY_AXIS_LEFT_X, Vector2.ZERO.x) simulate_joystick_motion(JOY_AXIS_LEFT_Y, Vector2.ZERO.y) thumbstick.position = middle - thumbstick.size / 2.0 thumbstick.texture = talk_a_texture if event is InputEventScreenTouch and pressed == true: Input.action_press("ui_select") pressed = false if event is InputEventScreenTouch and event.is_pressed(): pressed = true if event is InputEventScreenDrag: # cancel the talking action pressed = false # swap to drag texture thumbstick.texture = drag_texture var touch_position: Vector2 = event.position # visual thumbstick movement var thumbstick_position: Vector2 = touch_position - thumbstick.size / 2.0 #var clamped_thumbstick_position = thumbstick_position.clampf(-40.0, 40.0) thumbstick.position = thumbstick_position # actual value var _delta: Vector2 = middle - touch_position var direction: Vector2 = _delta.normalized() simulate_joystick_motion(JOY_AXIS_LEFT_X, -direction.x) simulate_joystick_motion(JOY_AXIS_LEFT_Y, -direction.y) func simulate_joystick_motion(axis: JoyAxis, value: float, device_id: int = 0) -> void: var joystick_event: InputEventJoypadMotion = InputEventJoypadMotion.new() joystick_event.device = device_id joystick_event.axis = axis # Axis index (e.g., 0 for X-axis, 1 for Y-axis) joystick_event.axis_value = value # Value of the axis, typically between -1 and 1 Input.parse_input_event(joystick_event) # Process the event func _on_resized() -> void: middle = size / 2.0 thumbstick = get_node("Thumbstick") thumbstick.position = middle - thumbstick.size / 2.0