Кнопки увеличения/уменьшение масштаба. Кольцо вокруг корабля

This commit is contained in:
sasha80
2025-10-08 23:53:16 +03:00
parent 4284aa97ce
commit 3b53e2bfaa
2 changed files with 130 additions and 10 deletions

View File

@@ -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)) # отрисовка заливки

View File

@@ -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"]