FantasyRun/character/character.gd

71 lines
1.7 KiB
GDScript

extends Area3D
class_name Character
signal turn(direction: TileTurn.Direction)
@export var speed: float = 20.0
@export var jump_height: float = 3
@export var tile: Tile
var total_distance: float = 0.0
var current_height: float = 0.0
var jump_tween: Tween
var fall_tween: Tween
var in_air: bool = false
func _ready() -> void:
if tile == null or tile is not Tile:
printerr("tile is not set to a Tile")
return
func _process(delta: float) -> void:
if tile == null:
return
if Input.is_action_just_pressed("ui_right"):
turn.emit(TileTurn.Direction.Right)
if Input.is_action_just_pressed("ui_left"):
turn.emit(TileTurn.Direction.Left)
if Input.is_action_just_pressed("ui_up"):
jump()
global_position = tile.marker_position
global_rotation = tile.marker_rotation
if tile.follow.progress_ratio >= 1:
return
var travel: float = speed * delta
tile.follow.progress += travel
total_distance += travel
tile.follow.v_offset = current_height
func _on_area_entered(area):
if area is Obstacle:
handle_obstacle(area)
func handle_obstacle(obstacle: Obstacle) -> void:
if obstacle.effect == Obstacle.ObstacleEffect.Kill:
print("kill")
speed = 0
func jump() -> void:
if in_air:
return
in_air = true
jump_tween = get_tree().create_tween()
jump_tween.tween_property(self, "current_height", jump_height, 0.25).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
jump_tween.tween_callback(fall)
func fall() -> void:
fall_tween = get_tree().create_tween()
fall_tween.tween_property(self, "current_height", 0, 0.25).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
fall_tween.tween_callback(finish_falling)
func finish_falling() -> void:
in_air = false