forked from team-sg/hero-mark-2
99 lines
3.4 KiB
GDScript
99 lines
3.4 KiB
GDScript
extends Node
|
|
|
|
export var travel_time: float = 1.0
|
|
|
|
var selected_level: int = 0
|
|
var tween: SceneTreeTween = null
|
|
var hop_tween: SceneTreeTween = null
|
|
|
|
onready var level_path: Path2D = $LevelPath
|
|
onready var player_position: PathFollow2D = $"%PlayerPosition"
|
|
onready var player_sprite: Sprite = $"%PlayerSprite"
|
|
onready var back_arrow: TextureRect = $"%BackArrow"
|
|
onready var level_title: Label = $"%LevelTitle"
|
|
onready var forward_arrow: TextureRect = $"%ForwardArrow"
|
|
onready var in_cave: PathFollow2D = $"%InCave"
|
|
onready var out_cave: PathFollow2D = $"%OutCave"
|
|
|
|
func _ready() -> void:
|
|
Fade.fade_in(0.4)
|
|
Audio.ac_music.stop()
|
|
# set initial offset
|
|
LevelData.levels[selected_level].save_id
|
|
var target_level = level_path.get_node(LevelData.levels[selected_level].save_id)
|
|
if target_level != null:
|
|
player_position.offset = target_level.offset
|
|
_select_level(selected_level)
|
|
|
|
#func _input(event: InputEvent) -> void:
|
|
# # load selected map
|
|
# if Input.is_action_just_pressed("ui_accept"):
|
|
# Game.current_level = selected_level
|
|
# Game.change_map(LevelData.levels[selected_level].scene)
|
|
# elif Input.is_action_just_pressed("ui_right"):
|
|
# _select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1)))
|
|
# elif Input.is_action_just_pressed("ui_left"):
|
|
# _select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1)))
|
|
|
|
func _process(delta: float) -> void:
|
|
# load selected map
|
|
if Input.is_action_just_pressed("ui_accept"):
|
|
Game.current_level = selected_level
|
|
Game.change_map(LevelData.levels[selected_level].scene)
|
|
elif Input.is_action_just_pressed("ui_right"):
|
|
_select_level(int(clamp(selected_level + 1, 0, LevelData.levels.size() - 1)))
|
|
elif Input.is_action_just_pressed("ui_left"):
|
|
_select_level(int(clamp(selected_level - 1, 0, LevelData.levels.size() - 1)))
|
|
|
|
# make SG disappear inside of cave
|
|
if player_position.offset >= in_cave.offset and player_position.offset <= out_cave.offset:
|
|
player_sprite.visible = false
|
|
else:
|
|
player_sprite.visible = true
|
|
|
|
func _select_level(level_id: int) -> void:
|
|
var level = LevelData.levels[level_id]
|
|
selected_level = level_id
|
|
# hide arrows at edges of leve set
|
|
if level_id == 0:
|
|
back_arrow.modulate.a = 0.0
|
|
else:
|
|
back_arrow.modulate.a = 1.0
|
|
if level_id == LevelData.levels.size() - 1:
|
|
forward_arrow.modulate.a = 0.0
|
|
else:
|
|
forward_arrow.modulate.a = 1.0
|
|
# set text
|
|
level_title.text = level.title
|
|
# initiate animation
|
|
_travel_to_level(level.save_id)
|
|
|
|
func _travel_to_level(level_name: String) -> void:
|
|
# get path offset of target level
|
|
var target_level = level_path.get_node(level_name)
|
|
if target_level != null:
|
|
if target_level.offset < player_position.offset:
|
|
player_sprite.flip_h = true
|
|
else:
|
|
player_sprite.flip_h = false
|
|
# kill existing tweens if exist
|
|
if tween != null:
|
|
tween.kill()
|
|
if hop_tween != null:
|
|
hop_tween.kill()
|
|
player_sprite.position.y = -2.0
|
|
|
|
# hopping animation
|
|
hop_tween = create_tween().set_loops()
|
|
hop_tween.tween_property(player_sprite, "position:y", -4.0, 0.0)
|
|
hop_tween.tween_interval(0.1)
|
|
hop_tween.tween_property(player_sprite, "position:y", -2.0, 0.0)
|
|
hop_tween.tween_interval(0.1)
|
|
|
|
# travel animation
|
|
tween = create_tween()
|
|
# go to target offset
|
|
tween.tween_property(player_position, "offset", target_level.offset, travel_time)
|
|
# kill other animation
|
|
tween.tween_callback(hop_tween, "kill")
|
|
tween.tween_property(player_sprite, "position:y", -2.0, 0.0)
|