You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.6 KiB

extends CharacterBody3D
const SPEED = 3.5
const RUN_MULT = 2.0
const JUMP_VELOCITY = 4.5
const LIN_ACCEL = 0.25
const ANG_ACCEL = 0.25
const INNERTIA = 0.4
var animp : AnimationPlayer
var anim_tree : AnimationTree
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
var speed = SPEED
func _ready():
anim_tree = $Abe_Lo/AnimationTree
animp = $Abe_Lo/AnimationPlayer
animp.play("ANIM_Abe_Idle_01")
animp.speed_scale = 1.5
func map( value : float , in_min : float, in_max : float, out_min : float, out_max : float ):
#=( ( value - in_min ) / ( in_max - in_min ) * ( out_max-out_min ) + out_min)
var mapped_value = ( value - in_min ) / ( in_max - in_min ) * ( out_max-out_min ) + out_min
return mapped_value
func update_tree():
anim_tree["parameters/Walk/blend_amount"] = animp.speed_scale / 1.5
anim_tree["parameters/Run/blend_amount"] = map ( speed , SPEED , SPEED * RUN_MULT , 0 , 1 )
func _physics_process(delta):
# Add the gravity.
if not is_on_floor():
velocity.y -= gravity * delta
else:
anim_tree["parameters/Jump/blend_amount"] = move_toward( anim_tree["parameters/Jump/blend_amount"] , 0.0 , 0.1)
# Handle jump.
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = JUMP_VELOCITY
anim_tree["parameters/Jump/blend_amount"] = 1.0
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var input_dir = Input.get_vector("left", "right", "up", "down")
var run = Input.is_action_pressed("run")
if run:
speed = move_toward( speed , SPEED * RUN_MULT , LIN_ACCEL )
else:
speed = move_toward( speed , SPEED , LIN_ACCEL )
# Caculate directions from input
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
var direction2d = Vector2(-direction.x,direction.z)
#moving
if direction and (is_on_floor() or (not is_on_floor() and is_on_wall()) ):
animp.speed_scale = 1.5
velocity.x = direction.x * speed
velocity.z = direction.z * speed
#if speed > SPEED:
#$GPUParticles3D.amount_ratio = speed / ( SPEED * RUN_MULT )
var new_rotation = Vector3( 0.0, direction2d.angle() - (PI/2) , 0.0 )
$Abe_Lo.rotation = Vector3( 0.0 , rotate_toward( $Abe_Lo.rotation.y , new_rotation.y , ANG_ACCEL ), 0.0)
else:
if is_on_floor():
velocity.x = move_toward(velocity.x, 0, INNERTIA )
velocity.z = move_toward(velocity.z, 0, INNERTIA )
animp.speed_scale = move_toward( animp.speed_scale, 0 , .05 )
$GPUParticles3D.amount_ratio = 0.0
update_tree()
move_and_slide()