extends KinematicBody export var anim_col = 0 export var speed = 7 export var gravity = 20 const ACCEL_DEFAULT = 7 const ACCEL_AIR = 1 onready var accel = ACCEL_DEFAULT var direction = Vector3() var velocity = Vector3() var gravity_vec = Vector3() var movement = Vector3() var snap var jump = 10 onready var sprite = $Sprite3D onready var ani_player = $AnimationPlayer var camera = null func _ready(): add_to_group("Imps") ani_player.play("anim_col") func _physics_process(delta): follow_camera() jump(delta) move(delta) func set_camera(c): camera = c func follow_camera(): if camera == null: return var p_fwd = -camera.global_transform.basis.z var fwd = global_transform.basis.z var left = global_transform.basis.x var l_dot = left.dot(p_fwd) var f_dot = fwd.dot(p_fwd) var row = 0 sprite.flip_h = false if f_dot < -8.5: row = 0 # front sprite elif f_dot > 8.5: row = 4 # back sprite else: sprite.flip_h = l_dot > 0 if abs(f_dot) < 0.3: row = 2 # left sprite elif f_dot < 0: row = 1 # forward left sprite else: row = 3 # back left sprite sprite.frame = anim_col + row * 4 func jump(delta): #jumping and gravity if is_on_floor(): snap = -get_floor_normal() accel = ACCEL_DEFAULT gravity_vec = Vector3.ZERO else: snap = Vector3.DOWN accel = ACCEL_AIR gravity_vec += Vector3.DOWN * gravity * delta #if Input.is_action_just_pressed("jump") and is_on_floor(): # snap = Vector3.ZERO # gravity_vec = Vector3.UP * jump func move(delta): #make it move velocity = velocity.linear_interpolate(direction * speed, accel * delta) movement = velocity + gravity_vec move_and_slide_with_snap(movement, snap, Vector3.UP)