extends Control @export var stick_position : Vector2 = Vector2.ZERO : set(value) : stick_position = value.normalized() if value.length_squared() > 1. else value queue_redraw() @export var debug : bool = false : set(value): debug = value set_process_input(debug) @export_subgroup("Text", "text_") @export var text_show : bool = false : set(value) : text_show = value queue_redraw() @export_range(0, 8, 1) var text_precision : int = 2 : set(value): text_precision = value _compute_text_format() @export var text_font : Font = ThemeDB.fallback_font : set(value) : text_font = value _compute_font_sizes() @export var text_size : int = ThemeDB.fallback_font_size : set(value) : text_size = value _compute_font_sizes() @export_subgroup("Colors", "color_") @export var color_text : Color = Color.WHITE @export var color_background : Color = Color(0.1, 0.1, 0.1) @export var color_foreground : Color = Color(0.6, 0.6, 0.6) @export_subgroup("Sizes", "size_") @export var size_stick_ratio : float = 0.25 var font_height : float var text_height : float var text_format : String func _ready() -> void: _compute_font_sizes() _compute_text_format() set_process_input(debug) func _compute_text_format() -> void: text_format = "(%%.0%df, %%.0%df)" % [ text_precision, text_precision ] queue_redraw() func _compute_font_sizes() -> void: if text_font != null: font_height = text_font.get_height(text_size) text_height = font_height + text_font.get_descent(text_size) else: font_height = 0. text_height = 0. func _draw() -> void: var rect : Rect2 = get_rect() draw_rect(rect, Color.TRANSPARENT) if text_show: rect.size.y = rect.size.y - text_height var center : Vector2 = rect.size / 2. var max_pos : Vector2 = center * (1. - size_stick_ratio) var max_sizes : Vector2 = center * size_stick_ratio var max_size : float = min(max_sizes.x, max_sizes.y) draw_circle(center, min(center.x, center.y), color_background) draw_circle(center + stick_position * max_pos, max_size, color_foreground) if text_font != null and text_show: var text : String = text_format % [ stick_position.x, stick_position.y ] var text_offset : float = text_font.get_string_size(text, HORIZONTAL_ALIGNMENT_CENTER ,-1, text_size).x / 2. draw_string( text_font, Vector2(center.x - text_offset, rect.size.y + font_height), text, HORIZONTAL_ALIGNMENT_CENTER, -1., text_size, color_text) func _input(event : InputEvent) -> void: if event is InputEventJoypadMotion: var jev : InputEventJoypadMotion = event match jev.axis: JOY_AXIS_LEFT_X: stick_position.x = jev.axis_value JOY_AXIS_LEFT_Y: stick_position.y = jev.axis_value _: pass
or share this direct link: