sorry i know it getting annoying but im always changing how physics work in this fangame
and yeah how do i add jump animation!
extends KinematicBody2D
export var input_left : String = "left"
export var input_right : String = "right"
export var input_jump : String = "jump"
export var max_jump_height = 150 setget set_max_jump_height
export var min_jump_height = 40 setget set_min_jump_height
export var double_jump_height = 100 setget set_double_jump_height
export var jump_duration = 0.3 setget set_jump_duration
export var falling_gravity_multiplier = 1.5
export var max_jump_amount = 1
export var max_acceleration = 3500
export var friction = 8
export var can_hold_jump : bool = false
export var coyote_time : float = 0.1
export var jump_buffer : float = 0.1
var max_speed = 300
var acceleration_time = 10
var default_gravity : float
var jump_velocity : float
var double_jump_velocity : float
var release_gravity_multiplier : float
var jumps_left : int
var holding_jump := false
var vel = Vector2()
var acc = Vector2()
onready var coyote_timer = Timer.new()
onready var jump_buffer_timer = Timer.new()
func _init():
default_gravity = calculate_gravity(max_jump_height, jump_duration)
jump_velocity = calculate_jump_velocity(max_jump_height, jump_duration)
double_jump_velocity = calculate_jump_velocity2(double_jump_height, default_gravity)
release_gravity_multiplier = calculate_release_gravity_multiplier(
jump_velocity, min_jump_height, default_gravity)
func _ready():
add_child(coyote_timer)
coyote_timer.wait_time = coyote_time
coyote_timer.one_shot = true
add_child(jump_buffer_timer)
jump_buffer_timer.wait_time = jump_buffer
jump_buffer_timer.one_shot = true
func _physics_process(delta):
acc.x = 0
if is_on_floor():
coyote_timer.start()
if not coyote_timer.is_stopped():
jumps_left = max_jump_amount
if Input.is_action_pressed(input_left):
acc.x = -max_acceleration
$Sprite.flip_h = true
$AnimationPlayer.play("walk")
elif Input.is_action_pressed(input_right):
acc.x = max_acceleration
$Sprite.flip_h = false
$AnimationPlayer.play("walk")
else:
acc.x = 0
if is_on_floor():
$AnimationPlayer.play("idle")
if can_hold_jump:
if Input.is_action_pressed(input_jump):
if is_on_floor():
jump()
if not can_hold_jump:
if not jump_buffer_timer.is_stopped() and is_on_floor():
jump()
if Input.is_action_just_pressed(input_jump):
holding_jump = true
jump_buffer_timer.start()
if not is_on_floor():
jump()
if Input.is_action_just_released(input_jump):
holding_jump = false
var gravity = default_gravity
if vel.y > 0:
gravity *= falling_gravity_multiplier
if not holding_jump and vel.y < 0:
if not jumps_left < max_jump_amount - 1:
gravity *= release_gravity_multiplier
acc.y = -gravity
vel.x *= 1 / (1 + (delta * friction))
vel += acc * delta
vel = move_and_slide(vel, Vector2.UP)
func calculate_gravity(p_max_jump_height, p_jump_duration):
return (-2 *p_max_jump_height) / pow(p_jump_duration, 2)
func calculate_jump_velocity(p_max_jump_height, p_jump_duration):
return (2 * p_max_jump_height) / (p_jump_duration)
func calculate_jump_velocity2(p_max_jump_height, p_gravity):
return sqrt(-2 * p_gravity * p_max_jump_height)
func calculate_release_gravity_multiplier(p_jump_velocity, p_min_jump_height, p_gravity):
var release_gravity = 0 - pow(p_jump_velocity, 2) / (2 * p_min_jump_height)
return release_gravity / p_gravity
func calculate_friction(time_to_max):
return 1 - (2.30259 / time_to_max)
func calculate_speed(p_max_speed, p_friction):
return (p_max_speed / p_friction) - p_max_speed
func jump():
if jumps_left == max_jump_amount and coyote_timer.is_stopped():
jumps_left -= 1
if jumps_left > 0:
if jumps_left < max_jump_amount:
vel.y = -double_jump_velocity
else:
vel.y = -jump_velocity
jumps_left -= 1
coyote_timer.stop()
func set_max_jump_height(value):
max_jump_height = value
default_gravity = calculate_gravity(max_jump_height, jump_duration)
jump_velocity = calculate_jump_velocity(max_jump_height, jump_duration)
double_jump_velocity = calculate_jump_velocity2(double_jump_height, default_gravity)
release_gravity_multiplier = calculate_release_gravity_multiplier(
jump_velocity, min_jump_height, default_gravity)
func set_jump_duration(value):
jump_duration = value
default_gravity = calculate_gravity(max_jump_height, jump_duration)
jump_velocity = calculate_jump_velocity(max_jump_height, jump_duration)
double_jump_velocity = calculate_jump_velocity2(double_jump_height, default_gravity)
release_gravity_multiplier = calculate_release_gravity_multiplier(
jump_velocity, min_jump_height, default_gravity)
func set_min_jump_height(value):
min_jump_height = value
release_gravity_multiplier = calculate_release_gravity_multiplier(
jump_velocity, min_jump_height, default_gravity)
func set_double_jump_height(value):
double_jump_height = value
double_jump_velocity = calculate_jump_velocity2(double_jump_height, default_gravity)