Is it possible to detect if a mouse pointer is hovering over Area 2D

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Yogya

I am working on a game and i want a sprite to change animation if the mouse pointer is hovering over an Area2D which is the child node of the sprite. The sprite is a closed door
and i want it to change to an open door.
If there is any other method to do this kindly tell.
I cannot find anything related to this question

:bust_in_silhouette: Reply From: deaton64

Maybe look elsewhere: Detecting if the mouse is over an Area2D

:bust_in_silhouette: Reply From: Tom Mertz

There are a couple different ways to do this from what I could find.

The Area2D inherits from CollisionObject2D which has the signal mouse_entered From the docs:

Emitted when the mouse pointer enters any of this object’s shapes. Requires input_pickable to be true and at least one collision_layer bit to be set.

So make sure you set your input_pickable to on in the inspector and have a collision layer selection.

Check out the docs on how to setup signals.

For me, I was doing the checking on the mouse every frame and didn’t want to have to connect my objects I was creating at run time, so on my master mouse script I used the Physics2DDirectSpaceState’s method intersect_point:

func _physics_process(delta):
    # get the Physics2DDirectSpaceState object
	var space = get_world_2d().direct_space_state
    # Get the mouse's position
	var mousePos = get_global_mouse_position()
    # Check if there is a collision at the mouse position
	if space.intersect_point(mousePos, 1):
		print("hit something")
		print("no hit")

It’s worth noting that the above code checks for Rigidbodies by default, if you need to check for Areas, you’ll need to use some like

 if space.intersect_point(mousePos, 1, [], 2147483647, true, true):

The docs on the intersect_point method give more info on what all the params are, but the last true is the most important for Area2D checking.

The get_global_mouse_position method is only available on a CanvasItem and all its subclasses. So, any subclass of Control and Node2D. If your script is extending a regular Node. You can use the method from NatGazer below to get the mouse position:

var mousePos = get_viewport().get_mouse_position()

I had to use this to get mouse position in Godot 4.0.2:

var mousePos = get_viewport().get_mouse_position()

NatGazer | 2023-05-09 14:46

Are you sure your script has a extends at the top that is CanvasItem or above? Node2D and Control (and all of their subclasses) both inherit from CanvasItem so they both have access to the get_global_mouse_position method. If your script had just extends Node you wouldn’t have access to that method. Your way it totally fine though if your script/scene isn’t a Node2D or Control. But it’s possible you could also change your extends and it’d work.

Tom Mertz | 2023-05-16 00:56