91 lines
3.0 KiB
GDScript
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()
|