diff --git a/misc/joypads/README.md b/misc/joypads/README.md index fe445e87..8a2763bb 100644 --- a/misc/joypads/README.md +++ b/misc/joypads/README.md @@ -1,13 +1,15 @@ # Joypads Demo -A tool for testing joypad input. +A tool for testing +[joypad input](https://docs.godotengine.org/en/latest/tutorials/inputs/controllers_gamepads_joysticks.html) +and generating controller mapping strings. Language: GDScript -Renderer: GLES 2 +Renderer: Compatibility Check out this demo on the asset library: https://godotengine.org/asset-library/asset/140 ## Screenshots -![Screenshot](screenshots/joypads.png) +![Screenshot](screenshots/joypads.webp) diff --git a/misc/joypads/joypads.gd b/misc/joypads/joypads.gd index 0d48ccb0..1da729fc 100644 --- a/misc/joypads/joypads.gd +++ b/misc/joypads/joypads.gd @@ -9,7 +9,7 @@ extends Control const DEADZONE = 0.2 const FONT_COLOR_DEFAULT = Color(1.0, 1.0, 1.0, 0.5) -const FONT_COLOR_ACTIVE = Color.WHITE +const FONT_COLOR_ACTIVE = Color(0.2, 1.0, 0.2, 1.0) var joy_num var cur_joy = -1 @@ -23,24 +23,29 @@ var axis_value @onready var joypad_number = $DeviceInfo/JoyNumber func _ready(): - set_physics_process(true) Input.joy_connection_changed.connect(self._on_joy_connection_changed) + for joypad in Input.get_connected_joypads(): + print_rich("Found joypad #%d: [b]%s[/b] - %s" % [joypad, Input.get_joy_name(joypad), Input.get_joy_guid(joypad)]) func _process(_delta): # Get the joypad device number from the spinbox. - joy_num = joypad_number.get_value() + joy_num = joypad_number.value # Display the name of the joypad if we haven't already. if joy_num != cur_joy: cur_joy = joy_num - joypad_name.set_text(Input.get_joy_name(joy_num) + "\n" + Input.get_joy_guid(joy_num)) + if Input.get_joy_name(joy_num) != "": + set_joypad_name(Input.get_joy_name(joy_num), Input.get_joy_guid(joy_num)) + else: + clear_joypad_name() + # Loop through the axes and show their current values. for axis in range(int(min(JOY_AXIS_MAX, 10))): axis_value = Input.get_joy_axis(joy_num, axis) axes.get_node("Axis" + str(axis) + "/ProgressBar").set_value(100 * axis_value) - axes.get_node("Axis" + str(axis) + "/ProgressBar/Value").set_text(str(axis_value)) + axes.get_node("Axis" + str(axis) + "/ProgressBar/Value").set_text("[center][fade start=2 length=16]%s[/fade][/center]" % axis_value) # Scaled value used for alpha channel using valid range rather than including unusable deadzone values. var scaled_alpha_value = (abs(axis_value) - DEADZONE) / (1.0 - DEADZONE) # Show joypad direction indicators @@ -85,11 +90,17 @@ func _process(_delta): # Called whenever a joypad has been connected or disconnected. func _on_joy_connection_changed(device_id, connected): + if connected: + print_rich("[color=green]Found newly connected joypad #%d: [b]%s[/b] - %s[/color]" % [device_id, Input.get_joy_name(device_id), Input.get_joy_guid(device_id)]) + else: + print_rich("[color=red]Disconnected joypad #%d.[/color]" % device_id) + if device_id == cur_joy: + # Update current joypad label. if connected: - joypad_name.set_text(Input.get_joy_name(device_id) + "\n" + Input.get_joy_guid(device_id)) + set_joypad_name(Input.get_joy_name(device_id), Input.get_joy_guid(device_id)) else: - joypad_name.set_text("") + clear_joypad_name() func _on_start_vibration_pressed(): @@ -117,3 +128,23 @@ func _on_Clear_pressed(): func _on_Show_pressed(): $RemapWizard.show_map() + + +func _on_joy_name_meta_clicked(meta): + OS.shell_open(meta) + + +func set_joypad_name(joy_name, joy_guid): + # Make the GUID clickable (and point to Godot's game controller database for easier lookup). + joypad_name.set_text("%s\n[color=#fff9][url=https://github.com/godotengine/godot/blob/master/core/input/gamecontrollerdb.txt]%s[/url][/color]" % [joy_name, joy_guid]) + + # Make the rest of the UI appear as enabled. + for node in [$JoypadDiagram, $Axes, $Buttons, $Vibration, $VBoxContainer]: + node.modulate.a = 1.0 + +func clear_joypad_name(): + joypad_name.set_text("[i]No controller detected at ID %d.[/i]" % joypad_number.value) + + # Make the rest of the UI appear as disabled. + for node in [$JoypadDiagram, $Axes, $Buttons, $Vibration, $VBoxContainer]: + node.modulate.a = 0.5 diff --git a/misc/joypads/joypads.tscn b/misc/joypads/joypads.tscn index b78c2d33..36092148 100644 --- a/misc/joypads/joypads.tscn +++ b/misc/joypads/joypads.tscn @@ -64,9 +64,11 @@ position = Vector2(415, 183) scale = Vector2(0.5, 0.5) [node name="DeviceInfo" type="HBoxContainer" parent="."] -layout_mode = 0 +layout_mode = 1 +anchors_preset = 10 anchor_right = 1.0 -offset_bottom = 30.0 +offset_top = -10.0 +offset_bottom = 40.0 grow_horizontal = 2 [node name="Label" type="Label" parent="DeviceInfo"] @@ -83,11 +85,16 @@ max_value = 16.0 modulate = Color(1, 1, 1, 0) layout_mode = 2 -[node name="JoyName" type="Label" parent="DeviceInfo"] +[node name="JoyName" type="RichTextLabel" parent="DeviceInfo"] +custom_minimum_size = Vector2(0, 50) layout_mode = 2 size_flags_horizontal = 3 -size_flags_vertical = 1 +focus_mode = 2 +bbcode_enabled = true text = "Controller Name Here" +scroll_active = false +context_menu_enabled = true +selection_enabled = true [node name="Axes" type="VBoxContainer" parent="."] layout_mode = 0 @@ -116,15 +123,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis0/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis0/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis1" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -146,15 +154,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis1/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis1/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis2" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -176,15 +185,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis2/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis2/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis3" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -206,15 +216,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis3/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis3/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis4" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -236,15 +247,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis4/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis4/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis5" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -266,15 +278,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis5/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis5/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis6" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -296,15 +309,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis6/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis6/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis7" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -326,15 +340,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis7/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis7/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis8" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -356,15 +371,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis8/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis8/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Axis9" type="HBoxContainer" parent="Axes"] layout_mode = 2 @@ -386,15 +402,16 @@ min_value = -100.0 step = 0.0001 show_percentage = false -[node name="Value" type="Label" parent="Axes/Axis9/ProgressBar"] +[node name="Value" type="RichTextLabel" parent="Axes/Axis9/ProgressBar"] +custom_minimum_size = Vector2(0, 24) layout_mode = 0 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -size_flags_vertical = 1 -text = "0" -horizontal_alignment = 1 +bbcode_enabled = true +text = "[center]0[/center]" +scroll_active = false [node name="Buttons" type="VBoxContainer" parent="."] layout_mode = 1 @@ -655,6 +672,7 @@ text = "Show" [node name="RemapWizard" parent="." instance=ExtResource("3")] +[connection signal="meta_clicked" from="DeviceInfo/JoyName" to="." method="_on_joy_name_meta_clicked"] [connection signal="pressed" from="Vibration/Buttons/Start" to="." method="_on_start_vibration_pressed"] [connection signal="pressed" from="Vibration/Buttons/Stop" to="." method="_on_stop_vibration_pressed"] [connection signal="pressed" from="VBoxContainer/Clear" to="." method="_on_Clear_pressed"] diff --git a/misc/joypads/project.godot b/misc/joypads/project.godot index 8214cb0d..b2b4faf0 100644 --- a/misc/joypads/project.godot +++ b/misc/joypads/project.godot @@ -24,3 +24,8 @@ window/size/viewport_height=560 window/vsync/vsync_mode=0 window/stretch/mode="canvas_items" window/stretch/aspect="expand" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/misc/joypads/screenshots/joypads.png b/misc/joypads/screenshots/joypads.png deleted file mode 100644 index dd0b5ce3..00000000 Binary files a/misc/joypads/screenshots/joypads.png and /dev/null differ diff --git a/misc/joypads/screenshots/joypads.webp b/misc/joypads/screenshots/joypads.webp new file mode 100644 index 00000000..abf31264 Binary files /dev/null and b/misc/joypads/screenshots/joypads.webp differ