104 lines
2.5 KiB
GDScript
104 lines
2.5 KiB
GDScript
extends CharacterBody2D
|
|
# Child Nodes
|
|
var camera : Camera2D;
|
|
var anim_sprite : AnimatedSprite2D
|
|
|
|
# Gravity
|
|
var earth_center = Vector2.ZERO;
|
|
var max_fall_speed = 700;
|
|
var gravity = 100;
|
|
var angle = 0;
|
|
|
|
# Movement
|
|
var hspeed = 150;
|
|
var jump_strength = 900;
|
|
var air_jumps_max = 1;
|
|
var air_jumps_current = 1;
|
|
|
|
# HP and Iframes
|
|
var current_hp = 5;
|
|
var max_hp = 5;
|
|
var hit_invulnerability = 0.5
|
|
var inv_time = 0;
|
|
|
|
# Received Knockback
|
|
var bonus_velocity = Vector2.ZERO
|
|
var knockback_strength = 1200
|
|
var damage_knockup = 200
|
|
|
|
|
|
func _ready() -> void:
|
|
camera = $Camera2D
|
|
anim_sprite = $AnimatedSprite2D
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if(inv_time > 0):
|
|
inv_time = max(0, inv_time-delta)
|
|
|
|
angle = -(position - earth_center).angle_to(Vector2.UP)
|
|
rotation = angle;
|
|
up_direction = (position - earth_center).normalized();
|
|
|
|
if(is_on_floor()):
|
|
air_jumps_current = air_jumps_max
|
|
|
|
manage_animation()
|
|
manage_velocity()
|
|
move_and_slide()
|
|
|
|
func manage_animation() -> void:
|
|
var walk_dir = 0
|
|
if(Input.is_action_pressed("move_right")):
|
|
walk_dir += 1
|
|
if(Input.is_action_pressed("move_left")):
|
|
walk_dir -= 1
|
|
|
|
if(walk_dir != 0):
|
|
anim_sprite.scale.x = - abs(anim_sprite.scale.x) * walk_dir
|
|
if(is_on_floor()):
|
|
anim_sprite.play("walk")
|
|
else:
|
|
anim_sprite.stop() # Later: Jump Animation?
|
|
else :
|
|
anim_sprite.stop()
|
|
|
|
func manage_velocity() -> void:
|
|
var old_local_velocity = local_from_global(velocity)
|
|
var local_velocity = Vector2(old_local_velocity.x/1.7, old_local_velocity.y);
|
|
local_velocity += Vector2(0, gravity)
|
|
|
|
if(Input.is_action_pressed("move_right")):
|
|
local_velocity += Vector2(hspeed, 0)
|
|
if(Input.is_action_pressed("move_left")):
|
|
local_velocity += Vector2(-hspeed, 0)
|
|
|
|
if(Input.is_action_just_pressed("jump") and (is_on_floor() or air_jumps_current > 0)):
|
|
if(not is_on_floor()):
|
|
air_jumps_current -= 1;
|
|
local_velocity.y = -jump_strength
|
|
|
|
if(local_velocity.y > max_fall_speed):
|
|
local_velocity.y = max_fall_speed
|
|
|
|
local_velocity += bonus_velocity
|
|
bonus_velocity = Vector2.ZERO
|
|
velocity = global_from_local(local_velocity)
|
|
|
|
|
|
func global_from_local (_velocity: Vector2) -> Vector2:
|
|
return _velocity.rotated(angle)
|
|
|
|
func local_from_global (_velocity: Vector2) -> Vector2:
|
|
return _velocity.rotated(-angle)
|
|
|
|
func hurt(dmg: int, dir: Vector2 = Vector2.ZERO):
|
|
if(inv_time <= 0):
|
|
current_hp -= dmg
|
|
if(current_hp <= 0):
|
|
die()
|
|
|
|
inv_time = hit_invulnerability
|
|
bonus_velocity = Vector2(-sign(local_from_global(dir).x)*knockback_strength, -damage_knockup)
|
|
|
|
func die():
|
|
print("You Died") # Placeholder
|