96 lines
2.2 KiB
GDScript
96 lines
2.2 KiB
GDScript
@tool
|
|
class_name LevelTransation extends Area2D
|
|
|
|
enum SIDE {
|
|
LEFT,
|
|
RIGHT,
|
|
TOP,
|
|
BOTTOM
|
|
}
|
|
|
|
@export_file("*.tscn") var level
|
|
@export var target_area: String = "LevelManager"
|
|
@export var center_player := false
|
|
@export_category("Collision Area Settings")
|
|
@export_range(1, 12, 1, "or_greater")
|
|
var size: int = 2 :
|
|
set(new_size):
|
|
size = new_size
|
|
update_area()
|
|
@export var side: SIDE = SIDE.LEFT :
|
|
set(new_side):
|
|
side = new_side
|
|
update_area()
|
|
@export var snap_to_grid: bool = false :
|
|
set(new_snap_to_grid):
|
|
snap_to_grid = new_snap_to_grid
|
|
update_snap_to_grid()
|
|
|
|
@onready var collision_shape: CollisionShape2D = $CollisionShape2D
|
|
|
|
func _ready() -> void:
|
|
update_area()
|
|
if Engine.is_editor_hint():
|
|
return
|
|
monitoring = false
|
|
place_player()
|
|
await LevelManager.level_loaded
|
|
monitoring = true
|
|
body_entered.connect(on_enter)
|
|
|
|
func update_area() -> void:
|
|
var new_rect: Vector2 = Vector2(32, 32)
|
|
var new_position: Vector2 = Vector2.ZERO
|
|
|
|
if side == SIDE.TOP:
|
|
new_rect.x *= size
|
|
new_position.y -= 16
|
|
elif side == SIDE.BOTTOM:
|
|
new_rect.x *= size
|
|
new_position.y += 16
|
|
elif side == SIDE.LEFT:
|
|
new_rect.y *= size
|
|
new_position.x -= 16
|
|
elif side == SIDE.RIGHT:
|
|
new_rect.y *= size
|
|
new_position.x += 16
|
|
|
|
if collision_shape == null:
|
|
collision_shape = get_node("CollisionShape2D")
|
|
|
|
collision_shape.shape.size = new_rect
|
|
collision_shape.position = new_position
|
|
|
|
func update_snap_to_grid() -> void:
|
|
position.x = round(position.x / 16) * 16
|
|
position.y = round(position.y / 16) * 16
|
|
|
|
func on_enter(_node: Node2D) -> void:
|
|
LevelManager.load_new_level(level, target_area, get_offset())
|
|
|
|
func place_player() -> void:
|
|
if name != LevelManager.target_transition:
|
|
return
|
|
PlayerManager.set_player_position(global_position + LevelManager.position_offset)
|
|
|
|
func get_offset() -> Vector2:
|
|
var offset := Vector2.ZERO
|
|
var player_pos := PlayerManager.player.global_position
|
|
if side == SIDE.LEFT or side == SIDE.RIGHT:
|
|
if center_player:
|
|
offset.y = 0
|
|
else:
|
|
offset.y = player_pos.y - global_position.y
|
|
offset.x = 16
|
|
if side == SIDE.LEFT:
|
|
offset.x *= -1
|
|
else:
|
|
if center_player:
|
|
offset.x = 0
|
|
else:
|
|
offset.x = player_pos.x - global_position.x
|
|
offset.y = 16
|
|
if side == SIDE.TOP:
|
|
offset.y *= -1
|
|
return offset
|