+1 vote

How would you flip the sprite left and right according to the mouse position.

KinematicBody2D
> PlayerSkin(Sprite)
    > GunSkin(Sprite)
in Engine by (80 points)

1 Answer

+1 vote
func _process(delta):
                                  # Sprite = PlayerSkin(Sprite)
if get_global_mouse_position().x > $Sprite.global_position.x:
    print("right")

else:
    print("left")
pass
by (755 points)

Thank you very much for the answer. It worked!
However, I wanted to play running_backward animation, when player is moving left(backward) and the mouse cursor is at right(forward).

something like this? how do I find that mouse position is opposite to the movement direction of the player ?

var is_running_backward := is_on_floor() and not is_zero_approx(_velocity.x) and "when the mouse position is opposite direction of the movement?" 

my current code is like this.

func _physics_process(delta: float) -> void:
var _horizontal_direction = (
    Input.get_action_strength("move_right")
    - Input.get_action_strength("move_left")
)

_velocity.x = _horizontal_direction * speed
_velocity.y += gravity * delta

var is_falling := _velocity.y > 0.0 and not is_on_floor()
var is_jumping := Input.is_action_just_pressed("jump") and is_on_floor()
var is_double_jumping := Input.is_action_just_pressed("jump") and is_falling
var is_jump_cancelled := Input.is_action_just_released("jump") and _velocity.y < 0.0
var is_idling := is_on_floor() and is_zero_approx(_velocity.x)
var is_running := is_on_floor() and not is_zero_approx(_velocity.x)
var is_running_backward := is_on_floor() and not is_zero_approx(_velocity.x) and 


if is_jumping:
    _jumps_made += 1
    _velocity.y = -jump_strength
elif is_double_jumping:
    _jumps_made += 1
    if _jumps_made <= maximum_jumps:
        _velocity.y = -double_jump_strength
elif is_jump_cancelled:
    _velocity.y = 0.0
elif is_idling or is_running:
    _jumps_made = 0

_velocity = move_and_slide(_velocity, UP_DIRECTION)


if get_global_mouse_position().x > $Position2D/PlayerSkin.global_position.x:
    print("right")
    position2D.scale.x=1
else:
    print("left")
    position2D.scale.x=-1

opposite direction * -1 . ("multiplied by -1")

maybe use

var mouse = true

 func _process(delta):
 if mouse == true: 
     if get_global_mouse_position().x > $Sprite.global_position.x:
        print("right")

    else:
        print("left")

if Input.is_action_pressed("ui_right"):
    print("walk")
    mouse = false
elif Input.is_action_pressed("ui_left"):
    print("back walk")
    mouse = false

else: 
    mouse = true

pass
##### OR
func _process(delta):
if ! is_running or is_running_backward:
    if get_global_mouse_position().x > $Sprite.global_position.x:
        print("right")

    else:
        print("left")

pass

My apologies. I should've made it more clear.
As you can see from the gif, player's foot moves forward when looking at right and moving to right. But when player is looking at right and moving to left, player's foot still moving forward.

Id like to play "Player-Run Backward" animation when input "move_left" and $sprite is right

enter image description here

Update´╝ü

I added some code like this. and It seems working as "backward" is printed on output, except the animation is not working and i have no idea why.

if get_global_mouse_position().x > $Position2D/PlayerSkin.global_position.x:

    print("right")
    position2D.scale.x=1

else:
    print("left")
    position2D.scale.x=-1


if get_global_mouse_position().x > $Position2D/PlayerSkin.global_position.x:
    if Input.get_action_strength("move_left"):
        print("backward")
        _animation_player.play("Player-Run Backward")

elif get_global_mouse_position().x < $Position2D/PlayerSkin.global_position.x:
    if Input.get_action_strength("move_right"):
        print("backward")
        _animation_player.play("Player-Run Backward")

enter image description here

check your code.
maybe an example like this can help

if position2D.scale.x == 1 :
      if press.forward:
            print("one")
      elif press.back:
            print("two")
elif position2D.scale.x == -1 :
       if press.forward:
            print("one one")
      elif press.back:
           print("two two")

Thank you. Thank you so much. It finally worked. I really appreciate your support.
Before I read your answer, I was doing something like this stupid. lmao

if get_global_mouse_position().x > $Position2D/PlayerSkin.global_position.x:
    print("right")
    position2D.scale.x=1
    if Input.is_action_just_pressed("move_right"):
        if is_running:
            print("forward")
            _animation_player.play("Player-Run (copy)")

if get_global_mouse_position().x < $Position2D/PlayerSkin.global_position.x:
    print("left")
    position2D.scale.x=-1
    if Input.is_action_just_pressed("move_left"):
        if is_running:
            print("forward")
            _animation_player.play("Player-Run (copy)")

if get_global_mouse_position().x > $Position2D/PlayerSkin.global_position.x:
    print("right")
    if Input.is_action_just_pressed("move_left"):
        if is_running:
            print("backward")
            _animation_player.play("Player-Run Backward")

if get_global_mouse_position().x < $Position2D/PlayerSkin.global_position.x:
    print("left")
    if Input.is_action_just_pressed("move_right"):
        if is_running:
            print("backward")
            _animation_player.play("Player-Run Backward")

Idea that you gave me is much much cleaner. Now this.

if position2D.scale.x==1:
    if Input.is_action_just_pressed("move_right"):
        print("forward1")
        _animation_player.play("Player-Run (copy)")
    elif Input.is_action_just_pressed("move_left"):
        print("backward1")
        _animation_player.play("Player-Run Backward")

elif position2D.scale.x==-1:
    if Input.is_action_just_pressed("move_left"):   
        print("forward2")           
        _animation_player.play("Player-Run (copy)")
    elif Input.is_action_just_pressed("move_right"):
        print("backward2")
        _animation_player.play("Player-Run Backward")

You're welcome. I wish you success in your project.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.