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.

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.

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.

  • Mick replied to this.

    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.

    • Mick replied to this.

      cybereality

      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 ?

      scene_tree is a variable.

      var scene_tree = get_viewport().get_tree()
      • Mick replied to this.

        cybereality

        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.....

        So I created a Script for each of the buttons, then on each of the buttons I set under Node mouse_entered() and mouse_exited() then added the code to the three buttons. Now the Hardware Mouse has control or the Controller has control, and all buttons are clickable....

        12 days later

        So I've nearly finished the basic menu system, which I'll post up soon. The only issue I need to resolve is, if I use Viewport setting and keep aspect, in settings. The mouse position doesn't seem to work and controller doesn't work correctly.

        Does anyone know how to get mouse position only inside viewport ?

        I think get_local_mouse_position() will get the coordinates of the immediate parent.

        • Mick replied to this.

          cybereality

          Yeah I tried that this morning, but didn't fix the problem. I'll post the project file when I get home tonight. The mouse still works fine on changed viewport size, problem happens on controller input....

          I'm in Aussie, so I won't be home from work for another 6 hours doh!