How to flip KinematicBody2D

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

I am making a 2d Game using godot 3.2 stable release, I want me Player to flip it’s direction along with it’s collision shapes, Only possible way of doing so is by fliping Entire kinematicsbody2D. But when doing so It behaves Strangely. Here’s a video of that
Strange Behaviour

here’s my script of doing so

	extends Actor

onready var _anim : AnimatedSprite = get_node("AnimatedSprite")

func _enemy_kills_me(body : PhysicsBody2D) -> void:
	queue_free()

func _killed_the_enemy(area : Area2D) -> void:

	_velocity.y = -maxSpeed.y / 2

func _process(delta):
	animPlayer()



func _physics_process(delta :float) -> void:
	var is_jumping = Input.is_action_just_released("jump") and _velocity.y < 0.0
	var Direction = Get_Direction()
	_velocity = Calcule_Jump_Height(Direction, _velocity, is_jumping)
	_velocity = move_and_slide(_velocity, Vector2.UP, true)

func Get_Direction() -> Vector2:
	var x = 0.0
	if Input.is_action_pressed("move_right"):
		x = 1.0
	elif Input.is_action_pressed("move_left"):
		x = -1.0
	else:
		x = 0.0
	
	if x != 0.0:
		scale.x = x * 0.75
	var y = 1.0
	
	var jumping := false
	if Input.is_action_just_pressed("jump") and is_on_floor():
		y = -1.0
	else:
		y = 1.0
		jumping = false

	return Vector2(x,y)

func Calcule_Jump_Height(
		dir :Vector2,
		linearVelocity :Vector2,
		is_Jumping : bool
) -> Vector2:
	var new_Velocity := linearVelocity
	if dir.x > 0.0:
		new_Velocity.x = min(new_Velocity.x + (speed * get_physics_process_delta_time() * 4) , maxSpeed.x)
	elif dir.x < 0.0 :
		new_Velocity.x = max(new_Velocity.x - (speed * get_physics_process_delta_time()  * 4), - maxSpeed.x)
	
	new_Velocity.y += Gravity * get_physics_process_delta_time()
	
	if dir.y == -1.0:
		new_Velocity.y = maxSpeed.y * dir.y 
	if is_Jumping:
		new_Velocity.y = 0.0

	if is_on_floor():
		if !Input.is_action_pressed("move_left") and !Input.is_action_pressed("move_right"):
			if new_Velocity.x < -100.0:
				new_Velocity.x += (speed * get_physics_process_delta_time() * 4)
			elif new_Velocity.x > 100.0:
				new_Velocity.x -= (speed * get_physics_process_delta_time() * 4)
			else:
				new_Velocity.x = 0
	if !is_on_floor():
		if !Input.is_action_pressed("move_left") and !Input.is_action_pressed("move_right"):
			if new_Velocity.x < -100.0:
				new_Velocity.x += (speed * get_physics_process_delta_time() / 2)
			elif new_Velocity.x > 100.0:
				new_Velocity.x -= (speed * get_physics_process_delta_time() / 2)
			else:
				new_Velocity.x = 0
	return new_Velocity

func animPlayer() -> void:
	if _velocity.x != 0.0 and _velocity.y == 0.0:
		_anim.play("Run")
		_anim.position.y = -109.105
	elif _velocity.y < 0.0:
		_anim.play("GoingUp")
		_anim.position.y = -82.0
	elif _velocity.y > 0.0:
		_anim.play("CommingDown")
		_anim.position.y = -90.0
	else:
		_anim.play("Idle")
		_anim.position.y = -109.105

i Used this code to flip

unc Get_Direction() -> Vector2:
var x = 0.0
if Input.is_action_pressed("move_right"):
    x = 1.0
elif Input.is_action_pressed("move_left"):
    x = -1.0
else:
    x = 0.0

if x != 0.0:
    scale.x = x * 0.75 # to flip character
var y = 1.0

var jumping := false
if Input.is_action_just_pressed("jump") and is_on_floor():
    y = -1.0
else:
    y = 1.0
    jumping = false

return Vector2(x,y)
:bust_in_silhouette: Reply From: jgodfrey

I’d think you could parent all of your existing Player nodes to a single, Node2D container, and simply flip that node to get the effect you want (via scale.x = 1 or scale.x = -1).

thanks, it worked :slight_smile:

Vikrant | 2020-11-25 14:53