Files
demo-godot-2410/PlayerController.gd
2025-02-06 23:39:13 +01:00

44 lines
1.8 KiB
GDScript

extends Node
@onready var is_mobile := (OS.has_feature("mobile") or OS.has_feature("web_android") or OS.has_feature("web_ios"))
@onready var controller_overlay: CanvasLayer = $controller_overlay
@onready var analog_stick_area: Control = $controller_overlay/analog_stick_area
@onready var analog_stick: TextureRect = $controller_overlay/analog_stick_area/analog_stick
@onready var analog_stick_p0 := analog_stick.position + .5 * analog_stick.size
var input_node: Node : get = get_input_node
var _analog_stick_pressed := false
func _ready() -> void:
if is_mobile:
set_process_input(false)
analog_stick_area.connect("gui_input", self._on_analog_stick_area_gui_input)
controller_overlay.visible = is_mobile
func get_input_node() -> Node:
var node := get_parent()
if not (node and "input_dir" in node):
return null
return node
func _input(event: InputEvent) -> void:
if event.is_action_pressed("ui_right") or event.is_action_released("ui_left"):
input_node.input_dir.x += 1
elif event.is_action_pressed("ui_left") or event.is_action_released("ui_right"):
input_node.input_dir.x -= 1
if event.is_action_pressed("ui_down") or event.is_action_released("ui_up"):
input_node.input_dir.y += 1
elif event.is_action_pressed("ui_up") or event.is_action_released("ui_down"):
input_node.input_dir.y -= 1
func _on_analog_stick_area_gui_input(event: InputEvent) -> void:
if event is InputEventMouse:
if event is InputEventMouseButton:
_analog_stick_pressed = event.pressed
var dp: Vector2 = (event.position - analog_stick_p0) if _analog_stick_pressed else Vector2.ZERO
analog_stick.position = analog_stick_p0 - .5 * analog_stick.size + dp.limit_length(10.0)
input_node.input_dir = dp.normalized()