Доработка. Настройки - копировать/вставлять/выделять в редактируемых полях. Работа - вывод текущих координат и масштаба цифрами, показ значком коробля текущие координаты коробля на карте, показ значком дрона текущие цели(угрозы)
This commit is contained in:
@@ -22,10 +22,17 @@ class_name MercatorTileMap
|
||||
@export_range(0, 20, 1) var min_zoom_level: int = 0
|
||||
@export_range(0, 20, 1) var max_zoom_level_server: int = 20
|
||||
@export_color_no_alpha() var back_color: = Color.BLACK
|
||||
@onready var scale_label: String
|
||||
@onready var coordinates_label: String
|
||||
@onready var threat_mark: PackedScene = load("res://scenes/tilemap/threat.tscn")
|
||||
@onready var ship_mark: PackedScene = load("res://scenes/tilemap/ship_mark.tscn")
|
||||
var ship_id := 9999
|
||||
var ship_instance: Node2D = null
|
||||
const default_size: = 400.0
|
||||
var is_centered: = false
|
||||
var is_out_border1: = true
|
||||
var is_out_border2: = true
|
||||
var threat_markers := {}
|
||||
|
||||
@export var animation_time: float = 0.1:
|
||||
set(val):
|
||||
@@ -94,6 +101,7 @@ signal map_server_online()
|
||||
## Вызывается при отсутствии ответа от сервера карт
|
||||
signal map_server_offline()
|
||||
|
||||
|
||||
const image_load_proc_names = {
|
||||
'png': 'load_png_from_buffer',
|
||||
'jpg': 'load_jpg_from_buffer',
|
||||
@@ -131,6 +139,9 @@ func _ready() -> void:
|
||||
var unit_nav = network.units[key]
|
||||
unit_nav.connect('data_received', on_data_received)
|
||||
ProjectSettings.connect('settings_changed', _settings_changed)
|
||||
threats.connect('threat_new', Callable(self, '_on_threat_new'))
|
||||
threats.connect('threat_lost', Callable(self, '_on_threat_lost'))
|
||||
threats.connect('threat_update', Callable(self, '_on_threat_update'))
|
||||
|
||||
|
||||
func _settings_changed():
|
||||
@@ -150,7 +161,7 @@ func _on_resize() -> void:
|
||||
$canvas/spr_mask.scale = $canvas.size / default_size
|
||||
|
||||
|
||||
## Создаёт новую отметку из координат экрана
|
||||
## Создаёт новую отметку из координат экранаa
|
||||
func add_mark_from_screen_pos(id: int, scr_xy: Vector2, mark: Node) -> bool:
|
||||
if _marks.has(id):
|
||||
return false
|
||||
@@ -238,6 +249,7 @@ func _input(e) -> void:
|
||||
func multiply_zoom(multiplier: float, pivot: Vector2) -> void:
|
||||
var p1: = screen_to_world(_xyz, pivot)
|
||||
_xyz.z = clampf(_xyz.z * multiplier, min_zoom_level, max_zoom_level)
|
||||
update_scale_label()
|
||||
var p2: = screen_to_world(_xyz, pivot)
|
||||
_xyz.x -= p2.x - p1.x
|
||||
_xyz.y -= p2.y - p1.y
|
||||
@@ -279,6 +291,7 @@ func _draw() -> void:
|
||||
var scr_pos = world_to_screen(dot.position)
|
||||
scr_pos.x = posmod(scr_pos.x, dx)
|
||||
dot.mark.position = scr_pos
|
||||
dot.mark.visible = is_mark_visible(dot)
|
||||
dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size)
|
||||
visible_marks_count += int(dot.mark.visible)
|
||||
# Рисование границ
|
||||
@@ -349,6 +362,8 @@ func _process(delta) -> void:
|
||||
push_error('запрос \"%s\" не отправлен' % tile.url)
|
||||
if _queue.is_empty():
|
||||
emit_signal('load_completed')
|
||||
|
||||
update_scale_label()
|
||||
|
||||
|
||||
func _response(result, code, _headers: Array, body: PackedByteArray, req, tile: Tile) -> void:
|
||||
@@ -552,8 +567,9 @@ func get_tile(x: int, y: int, z: int) -> Tile:
|
||||
var req = get_node_or_null(NodePath(str(idx)))
|
||||
if req:
|
||||
tile = req.get_meta('tile')
|
||||
tile.t = now
|
||||
return tile
|
||||
if tile != null:
|
||||
tile.t = now
|
||||
return tile
|
||||
|
||||
tile = _cache.get(idx)
|
||||
if tile:
|
||||
@@ -670,8 +686,49 @@ func set_coordinates(lon: float, lat: float) -> void:
|
||||
anim.track_insert_key(0, animation_time, new_pos.x)
|
||||
anim.track_insert_key(1, animation_time, new_pos.y)
|
||||
$player.play('goto')
|
||||
update_coordinates_label(lon, lat)
|
||||
if not _marks.has(ship_id):
|
||||
ship_instance = ship_mark.instantiate()
|
||||
add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0)
|
||||
else:
|
||||
_marks[ship_id].position = lonlat_to_world(lon, lat)
|
||||
|
||||
|
||||
func blend_mask(val: bool) -> void:
|
||||
$canvas/spr_mask.visible = val
|
||||
queue_redraw()
|
||||
|
||||
|
||||
func update_coordinates_label(lon: float, lat: float) -> void:
|
||||
coordinates_label = "Координаты:\nNS:%f\nEW: %f" % [lat, lon]
|
||||
signaller.emit_signal('update_coordinates_map', coordinates_label)
|
||||
|
||||
|
||||
func update_scale_label() -> void:
|
||||
scale_label = "Масштаб: " + str(round(_xyz.z))
|
||||
signaller.emit_signal('update_scale_map', scale_label)
|
||||
|
||||
|
||||
func _on_threat_new(th) -> void:
|
||||
var bip_instance = threat_mark.instantiate()
|
||||
if bip_instance:
|
||||
bip_instance.name = str(th.id)
|
||||
bip_instance.position = lonlat_to_world(th.lon, th.lat)
|
||||
add_mark_from_lon_lat(th.id, th.lon, th.lat, bip_instance, 32)
|
||||
|
||||
|
||||
func _on_threat_update(th) -> void:
|
||||
var target = get_parent().get_node(str(th.id))
|
||||
if not target:
|
||||
return
|
||||
var new_position = lonlat_to_world(th.lon, th.lat)
|
||||
if _marks.has(th.id):
|
||||
_marks[th.id].position = new_position
|
||||
if new_position != target.position:
|
||||
target.position = new_position
|
||||
|
||||
|
||||
func _on_threat_lost(th) -> void:
|
||||
var target = get_parent().get_node(str(th.id))
|
||||
if target:
|
||||
target.queue_free()
|
||||
|
||||
Reference in New Issue
Block a user