This site is currently in read-only mode during migration to a new platform.
You cannot post questions, answers or comments, as they would be lost during the migration otherwise.
+1 vote

I use this function to move the player, but the flip doesn't work. when I try scale.x = -10 it seems to multiply by -1, thus constantly flipping in the opposite direction than a moment ago.

func _move() -> void:
    var horizontal := Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
    var vertical := Input.get_action_strength("move_down") - Input.get_action_strength("move_up")

    var vector := Vector2(horizontal, vertical)

    if vector == Vector2.ZERO:
        if current_state == 'run':
            _set_animation('idle')
else:
    if current_state == 'idle':
        if horizontal == 1:
            scale.x = 10
        elif horizontal == -1:
            scale.x = -10
        _set_animation('run')
        move_and_slide(vector.normalized() * move_speed)
Godot version 3.3.2.stable.official
in Engine by (159 points)

I solve the problem. most likely this bug is related only to this class, with other classes it works fine. You should either change the node type or replace scale.x with transform.x.x.

Thanks a lot! I have the same Issue in Godot 3.4.3 and transfrom.x.x works, but I am interested in why does transform.x.x do the same?

3 Answers

0 votes

Why are you using operator "else" ? It not appropriate.

Try it:

if vector == Vector2.ZERO:
    if current_state == 'run':
        _set_animation('idle')

if current_state == 'idle':
    if vector.horizontal >= 1:
        scale.x = 10
    elif vector.horizontal =< -1:
        scale.x = -10
    _set_animation('run')
    move_and_slide(vector.normalized() * move_speed)
by (49 points)
0 votes

Inverting:
scale.x*=-1

by (230 points)
0 votes

See my answer on https://godotengine.org/qa/92282/why-my-character-scale-keep-changing?show=146969#a146969

To sum up, when you go left, scale.x = -1 is converted into scale.y = -1 and rotation_degrees = 180, but scale.x remains 1 internally.

So if you keep going left, scale.x = -1 and it will keep flipping each frame, causing flickering.
While going right will never flip.

Thanks to Timofey, I added your workaround to my answer on the other question. The reason why transform.x.x works is that it modifies the base axes directly, so there is no matrix trick with negative scale.x and the rotation.

by (56 points)
edited by
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.