From 3b53e2bfaa8c9b4d64da11d440b9201f4f3fd360 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 8 Oct 2025 23:53:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D1=83?= =?UTF-8?q?=D0=B2=D0=B5=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=D0=B8=D1=8F/=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B0.=20=D0=9A=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D1=86=D0=BE=20=D0=B2=D0=BE=D0=BA=D1=80=D1=83=D0=B3?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=80=D0=B0=D0=B1=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tilemap/tilemap.gd | 95 ++++++++++++++++++++++++++++++++++++++- scenes/работа/работа.tscn | 45 +++++++++++++++---- 2 files changed, 130 insertions(+), 10 deletions(-) diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 2cbdfb3..d3dc681 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -23,6 +23,8 @@ const TILE_REQUEST_NAME: = 'tile_request_%d' @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 +@export var show_ship_radius: bool = true +@export var ship_radius_km: float = 8.0 @onready var scale_label: String @onready var coordinates_label: String @onready var threat_mark: PackedScene = load("res://scenes/tilemap/threat.tscn") @@ -34,6 +36,8 @@ var is_centered: = false var is_out_border1: = true var is_out_border2: = true var threat_markers := {} +var zoom_timer: Timer +var zoom_action: String @export var animation_time: float = 0.1: set(val): @@ -129,6 +133,12 @@ func _ready() -> void: img.set_pixel(0, 1, Color.CORAL) border2 = ImageTexture.create_from_image(img) + zoom_timer = Timer.new() + add_child(zoom_timer) + zoom_timer.one_shot = false + zoom_timer.wait_time = 0.1 + zoom_timer.timeout.connect(_on_zoom_timeout) + _xyz.z = min_zoom_level image_type = 'png' $canvas.connect('mouse_entered', func(): _rollover = true) @@ -252,6 +262,7 @@ func multiply_zoom(multiplier: float, pivot: Vector2) -> void: var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y + update_scale_label() func increment_zoom(increment: float, pivot: Vector2) -> void: @@ -260,6 +271,7 @@ func increment_zoom(increment: float, pivot: Vector2) -> void: var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y + update_scale_label() func set_zoom(zoom: float, pivot: Vector2) -> void: @@ -268,6 +280,7 @@ func set_zoom(zoom: float, pivot: Vector2) -> void: var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y + update_scale_label() func _draw() -> void: @@ -302,6 +315,9 @@ func _draw() -> void: if is_out_border2 and _dragging: draw_texture_rect(border2, Rect2(p1, p2), false, Color.WHITE, false) + if should_draw_ship_radius(): + draw_ship_radius() + func _clean_all() -> void: _queue.clear() @@ -700,7 +716,7 @@ func blend_mask(val: bool) -> void: func update_coordinates_label(lon: float, lat: float) -> void: - coordinates_label = 'Координаты:\nNS:%f\nEW: %f' % [lat, lon] + coordinates_label = 'Координаты:\nNS:%f\nEW:%f' % [lat, lon] signaller.emit_signal('update_coordinates_map', coordinates_label) @@ -732,3 +748,80 @@ func _on_threat_lost(th) -> void: var target = get_parent().get_node(str(th.id)) if target: target.queue_free() + + +func zoom_in() -> void: + if _xyz.z >= max_zoom_level: + return + var center: Vector2 = $canvas.size / 2.0 + increment_zoom(zoom_step, center) + queue_redraw() + + +func zoom_out() -> void: + if _xyz.z <= min_zoom_level: + return + var center: Vector2 = $canvas.size / 2.0 + increment_zoom(-zoom_step, center) + queue_redraw() + + +func _on_zoom_plus_button_down() -> void: + zoom_action = "in" + perform_zoom() + zoom_timer.start(0.3) + + +func _on_zoom_minus_button_down() -> void: + zoom_action = "out" + perform_zoom() + zoom_timer.start(0.3) + + +func _on_zoom_button_up() -> void: + zoom_action = "" + zoom_timer.stop() + + +func _on_zoom_timeout(): + perform_zoom() + zoom_timer.wait_time = 0.1 + + +func perform_zoom(): + if zoom_action != "": + if zoom_action == "in": + zoom_in() + else: + zoom_out() + update_scale_label() + + +# Вычисление для радиуса в мировых координатах +func get_ship_radius_world() -> float: + if not _marks.has(ship_id): + return 0.0 + var ship_world_pos = _marks[ship_id].position + var ship_lonlat = world_to_lonlat(ship_world_pos.x, ship_world_pos.y) + var earth_radius_km = 6371.0 + var distance_deg = (ship_radius_km / earth_radius_km) * (180.0 / PI) / cos(deg_to_rad(ship_lonlat.y)) + var east_lon = ship_lonlat.x + distance_deg + var east_point_world = lonlat_to_world(east_lon, ship_lonlat.y) + return abs(east_point_world.x - ship_world_pos.x) + + +func should_draw_ship_radius() -> bool: + if not show_ship_radius or not _marks.has(ship_id): + return false + return _xyz.z >= 11 + + +func draw_ship_radius() -> void: + var ship_world_pos = _marks[ship_id].position + var ship_screen_pos = world_to_screen(ship_world_pos) + var radius_world = get_ship_radius_world() + var radius_point_world = Vector2(ship_world_pos.x + radius_world, ship_world_pos.y) + var radius_point_screen = world_to_screen(radius_point_world) + var radius_screen = ship_screen_pos.distance_to(radius_point_screen) + #draw_arc(ship_screen_pos, radius_screen, 0, TAU, 64, Color.ORANGE, 2.0) # отрисовка контура + draw_circle(ship_screen_pos, radius_screen, Color.ORANGE_RED * Color(1, 1, 1, 0.1)) # отрисовка заливки diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index f31ccf3..bbb9f01 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://b276iygic5itk"] +[gd_scene load_steps=18 format=3 uid="uid://b276iygic5itk"] [ext_resource type="Script" uid="uid://daudc0s3oox3i" path="res://scenes/работа/работа.gd" id="1_niok4"] [ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"] @@ -51,6 +51,9 @@ _data = { offsets = PackedFloat32Array(0.181818, 0.751623) colors = PackedColorArray(1, 1, 1, 0.352941, 1, 1, 1, 0) +[sub_resource type="SystemFont" id="SystemFont_5ffal"] +generate_mipmaps = true + [node name="Работа" type="Panel"] script = ExtResource("1_niok4") Bip = ExtResource("2_br3s6") @@ -86,6 +89,7 @@ self_modulate = Color(1, 1, 1, 0.415686) position = Vector2(360, 360) min_zoom_level = 3 max_zoom_level_server = 11 +ship_radius_km = 3.0 az = 3.0 [node name="player" type="AnimationPlayer" parent="tilemap"] @@ -95,11 +99,10 @@ libraries = { [node name="grd_side" parent="." instance=ExtResource("3_s2j0e")] layout_mode = 0 -offset_left = 1114.0 +offset_left = 1116.0 offset_top = 7.0 offset_right = 1594.0 offset_bottom = 1170.0 -metadata/_edit_lock_ = true [node name="grd_btns" parent="." instance=ExtResource("5_2jnbs")] layout_mode = 0 @@ -301,20 +304,39 @@ vertical_alignment = 1 [node name="coordinates_map" type="Label" parent="."] layout_mode = 0 -offset_left = 1000.0 +offset_left = 999.0 offset_top = 128.0 -offset_right = 1112.0 +offset_right = 1111.0 offset_bottom = 147.0 text = "Координаты:" [node name="scale_map" type="Label" parent="."] layout_mode = 0 -offset_left = 1000.0 -offset_top = 192.0 -offset_right = 1110.0 -offset_bottom = 213.0 +offset_left = 999.0 +offset_top = 202.0 +offset_right = 1109.0 +offset_bottom = 223.0 text = "Масштаб:" +[node name="zoom_plus" type="Button" parent="."] +layout_mode = 0 +offset_left = 1056.0 +offset_top = 230.0 +offset_right = 1088.0 +offset_bottom = 262.0 +theme_override_fonts/font = SubResource("SystemFont_5ffal") +theme_override_font_sizes/font_size = 20 +text = "+" + +[node name="zoom_minus" type="Button" parent="."] +layout_mode = 0 +offset_left = 1056.0 +offset_top = 270.0 +offset_right = 1088.0 +offset_bottom = 302.0 +theme_override_font_sizes/font_size = 20 +text = "−" + [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] @@ -322,3 +344,8 @@ text = "Масштаб:" [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] +[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"] +[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"] +[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] +[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"] +[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]