bugged-racing/scenes/track_minimap.gd

91 lines
3.0 KiB
GDScript

extends Node2D
export(Vector2) var size = Vector2(200, 200)
export(Texture) var player_icon
onready var scaling_helper = $ScalingHelper
onready var track_path = $ScalingHelper/TrackPath
onready var track_line = $ScalingHelper/TrackLine
onready var start_line = $ScalingHelper/TrackPath/StartLine
onready var players_container = $ScalingHelper/Players
func _ready() -> void:
scaling_helper.position.x = size.x / 2
scaling_helper.position.y = size.y / 2
MultiplayerController.connect("peers_updated", self, "_on_peers_updated")
func set_curve(curve: Curve3D) -> void:
var curve2d = Curve2D.new()
var point_count = curve.get_point_count()
for point in range(point_count):
var point3d = curve.get_point_position(point)
var point_in = curve.get_point_in(point)
var point_out = curve.get_point_out(point)
curve2d.add_point(
Vector2(point3d.x, point3d.z),
Vector2(point_in.x, point_in.z),
Vector2(point_out.x, point_out.z)
)
var max_x = curve2d.get_baked_points()[0].x
var max_y = curve2d.get_baked_points()[0].y
var min_x = curve2d.get_baked_points()[0].x
var min_y = curve2d.get_baked_points()[0].y
for point in curve2d.get_baked_points():
if point.x > max_x:
max_x = point.x
if point.x < min_x:
min_x = point.x
if point.y > max_y:
max_y = point.y
if point.y < min_y:
min_y = point.y
var center_x = (max_x + min_x) / 2
var center_y = (max_y + min_y) / 2
var width = max_x - min_x
var height = max_y - min_y
var max_dim = max(width, height)
var scale_factor = size.x / (max_dim + track_line.width)
var new_center_x = scaling_helper.position.x - (center_x * scale_factor)
var new_center_y = scaling_helper.position.y - (center_y * scale_factor)
scaling_helper.scale.x = scale_factor
scaling_helper.scale.y = scale_factor
scaling_helper.position.x = new_center_x
scaling_helper.position.y = new_center_y
track_path.curve = curve2d
track_line.curve = curve2d
start_line.offset = 0.01
func on_player_position_updated(player_id: int, position: Transform) -> void:
var existing_node: Sprite = players_container.get_node_or_null(String(player_id))
if existing_node == null:
var player_color
if MultiplayerController.is_online():
player_color = MultiplayerController.peers[player_id].color
else:
player_color = Color(1, 1, 1)
existing_node = Sprite.new()
existing_node.name = String(player_id)
existing_node.texture = player_icon
existing_node.modulate = player_color
players_container.add_child(existing_node)
existing_node.position.x = position.origin.x
existing_node.position.y = position.origin.z
existing_node.rotation = position.basis.x.signed_angle_to(Vector3.LEFT, Vector3.UP)
func _on_peers_updated() -> void:
for peer in MultiplayerController.peers:
var existing_node: Sprite = players_container.get_node_or_null(String(peer))
if existing_node != null:
var player_color = MultiplayerController.peers[peer].color
existing_node.modulate = player_color
for child in players_container.get_children():
if not MultiplayerController.peers.has(int(float(child.name))):
child.queue_free()