extends Panel @onready var talk_a_texture = preload("res://assets/textures/Xbox Series/Vector/xbox_button_a.svg") @onready var drag_texture = preload("res://assets/textures/Generic/Vector/generic_button_circle.svg") @onready var thumbstick = $Thumbstick var thumbstick_size_factor = 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 print(thumbstick) func _unhandled_input(event: InputEvent) -> void: if event is not InputEventScreenDrag: return if event is InputEventScreenDrag: var touch_position = event.position rotation_delta = get_viewport_rect().size / 2 - touch_position simulate_joystick_motion(JOY_AXIS_RIGHT_X, -rotation_delta.x * 0.4, 0) print(rotation_delta) 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(0, Vector2.ZERO.x) simulate_joystick_motion(1, 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") print("Talk") 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 = event.position thumbstick.position = touch_position - thumbstick.size / 2.0 var _delta = middle - touch_position var direction = _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: int, value: float, device_id: int = 0) -> void: var joystick_event = 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: print("Size changed to %s" % size) middle = size / 2.0 thumbstick = get_node("Thumbstick") #if thumbstick: thumbstick.custom_minimum_size = Vector2(size.x, size.x) * thumbstick_size_factor thumbstick.position = middle - thumbstick.size / 2.0