- Edited
Hi cyberreality, thanks for the code. I'm still having a few issues I'll post a screenshot so you can see. I'm a GDscript noob...
Hi cyberreality, thanks for the code. I'm still having a few issues I'll post a screenshot so you can see. I'm a GDscript noob...
The script needs to be on the node above the Cursor (so Menu in this case). Then also change the top line to extends Control
That worked thanks.
Something else I've noticed is, when I test (I have 3 Buttons). When I use the Hardware Mouse I can Highlight them and click, but when I use the controller I can highlight each button but when I click on anyone of them or in an open space on the screen the last Hardware Mouse clicked button is the one that works.
Sorry for asking for more help....
Your gamepad is likely switching focus around, read up on how UI focus properly works. Nodes need to be set up with references to their 'neighbors' so that the next or previous UI element could be selected/focused on.
https://docs.godotengine.org/en/stable/tutorials/ui/gui_navigation.html
Megalomaniak Thanks for the link I'll have a read and see if I can sort it out. I just expected the controller to behave the same as the mouse. The mouse can select and click on any button at any time.
Mick I just expected the controller to behave the same as the mouse. The mouse can select and click on any button at any time.
In that case disregard the above link. It's relevant for if you want to use the dpad directional buttons to navigate menu buttons or UI elements.
For a emulated mouse cursor you'd have to feed the analog input into a 2D element which could deal with either collision or doing a raycast. But for those to work your buttons would probably also need collision shapes of their own or areas to overlap. There's probably better ways...
There is a warp_mouse()
on control base class that might be useful perhaps? There's also a warp_mouse_position
in the Input class.
then again... InputEventMouseMotion does have a speed property that has a setter... I've never tried it but you could maybe hack it to move the mouse cursor.
and someone has already covered mouse clicking via input event parsing in here:
https://godotengine.org/qa/39531/how-do-i-simulate-a-left-mouse-click-godot-3-1-beta
Note that you can assign a custom icon to the mouse cursor via couple of ways.
TL;DR: You are better off actually controlling the real mouse cursor and events via code using the output of the 'InputEventJoypadMotion' and 'InputEventJoypadButton' than building a custom mouse emulator via Node2D or Control classes.
You probably need to generate a custom input event.
https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html
I just tried my code with a button and it seems to work fine. Can you explain more about your setup?
I just upload a YouTube to show what happens. The first 16 second are mouse control, then I change to a Ps4 controller. From 16 seconds it shows the cursor as not smooth and unable to select on buttons, although they highlight.
Here's a copy of the project
https://www.mediafire.com/file/ucjwkn8ci523f7r/menu_3.5.1.zip/file
I tried to fix it, but I don't have time tonight. The trick is to generate an input event when you press the gamepad button (not using the UI input mapping).
func _input(event):
if event is InputEventMouseMotion:
mouse_pos = event.position
if event.is_action_pressed("pad_click"):
var ev = InputEventMouseButton.new()
ev.button_index = 0
ev.pressed = true
ev.global_position = get_global_mouse_position()
Input.parse_input_event(ev)
But I couldn't get it to work, maybe I can check tomorrow or you can try to figure it out.
cybereality Thanks for the code I'll have a look when I get home tonight and see if I can figure it out. Will let you know...
I found some code, which I've modified to try and get smoother Cursor Movement. Next I'll try to add to the original Cursor code...
But then back to the X button click issue.....
Make sure to do input processing in _input():
rather than _process():
unless absolutely necessary so that input events can happen and be process in between frames being rendered too.
Thanks I do that...
Sorry I've not had much time due to work etc, I found the buttons still don't click to activate and lockup using the controller. I tried some changes below, but I still cant get the buttons to activate like using the hardware mouse. Just wondering if you had anymore ideas ?
I also found some other code picture below, but I had an error in scene_tree.set_input_as_handled() Parser Error: The Identifier "scene_tree" isn't declared in the current scope.
https://github.com/godotengine/godot/issues/64176#issuecomment-1214968121
scene_tree is a variable.
var scene_tree = get_viewport().get_tree()
Thanks....
I think I've worked out an easy method to highlight and click on buttons using the controller and or mouse, I'll post it tonight after work.....