| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- class_name Track
- extends Node2D
- const TRACK_PIECE = preload("uid://4gxhnql5bjk6")
- @export var path := []
- var pieces := []
- var length := 0
- @export_enum("Closed", "Open") var start_point := 0
- @export_enum("Closed", "Open") var end_point := 0
- @export var invisible := false:
- set(value):
- invisible = value
- update_pieces()
- var editing := false
- const DIRECTIONS := [
- Vector2i(-1, -1), # 0
- Vector2i.UP, # 1
- Vector2i(1, -1), # 2
- Vector2i.RIGHT, # 3
- Vector2i(1, 1), # 4
- Vector2i.DOWN, # 5
- Vector2i(-1, 1), # 6
- Vector2i.LEFT # 7
- ]
- func _process(_delta: float) -> void:
- $Point.frame = int(start_point == 0)
- visible = not (invisible and LevelEditor.playing_level)
- if editing and Global.current_game_mode == Global.GameMode.LEVEL_EDITOR:
- if Input.is_action_just_pressed("editor_open_menu") or Input.is_action_just_pressed("ui_cancel"):
- editing = false
- Global.level_editor.current_state = LevelEditor.EditorState.IDLE
- update_pieces()
- func _ready() -> void:
- for i in path:
- add_piece(i, false)
- update_pieces()
- func update_pieces() -> void:
- var idx := 0
- for i in $Pieces.get_children():
- i.idx = idx
- i.editing = idx >= path.size() and editing
- if idx > 0:
- i.starting_direction = -path[idx - 1]
- else:
- i.starting_direction = Vector2i.ZERO
- if idx <= path.size() - 1:
- i.connecting_direction = path[idx]
- else:
- i.connecting_direction = Vector2i.ZERO
- i.update_direction_textures()
- idx += 1
- func add_piece(new_direction := Vector2i.ZERO, add_to_arr := true) -> void:
- var piece = TRACK_PIECE.instantiate()
- var next_position := new_direction * 16
- for i in length:
- next_position += path[i] * 16
- piece.position = next_position
- $Pieces.add_child(piece)
- piece.owner = self
- pieces.append(piece)
- piece.idx = length
- piece.reset_physics_interpolation()
- if add_to_arr:
- path.append(new_direction)
- length += 1
- update_pieces()
- func remove_last_piece() -> void:
- $Pieces.get_child($Pieces.get_child_count() - 1).queue_free()
- await get_tree().process_frame
- path.pop_back()
- pieces.pop_back()
- length -= 1
- update_pieces()
|