3
votes

I am trying to make a sprite stop moving when it's x and y are the same as the mouse's.

For some reason, once the image is in the same position as the mouse the image starts going back and forth in the same axis really fast. I need to make it stop moving.

func _physics_process(delta):
    var move_vec = Vector2()
    var look_vec = get_global_mouse_position() - global_position
    //this gets the mouse and sprite position

    if move_vec != look_vec: // if mouse and sprite are not the same then move.
        move_vec = look_vec
        move_vec = move_vec.normalized()
        move_and_collide(move_vec * speed * delta)
        global_rotation = atan2(look_vec.y, look_vec.x)
    else:
        pass`enter code here`
2

2 Answers

1
votes

Ah this happened to me while working in game development with Unity.

The problem is that you're overshooting by very tiny amounts.

Say you want to get to position 0. You are hitting postions like 0.00004 then -0.0524 then 0.00242

Basically, you're oscillating near zero because it's never quite equal.

I suggest you try something like:

if move_vec - look_vec > someMinValue || move_vec - look_vec < -someMinValue 

(this is an absolute value comparison)

Basically, if it's within some small value, you can tell the game to relax and accept it. You may then choose to adjust the value to make it exactly equal to the desired value:

move_vec = look_vec

There are probably better answers you can come up with. The important thing here is that you understand what the issue is and can now correct in it your desired way.

1
votes

You need to set the velocity of the image to 0 in the else statement.

The image will have residual velocity since it was accelerating prior to being at the mouse position. Setting the images velocity to 0 will stop the image at the mouse position but make sure you do that after applying the acceleration so it cancels it out.

I'm not sure what move_and_collide(...) does but you might try passing it 0 in the else statement?

if move_vec != look_vec:
    ...
else:
    move_and_collide(0)