Кнопки увеличения/уменьшение масштаба. Кольцо вокруг корабля
This commit is contained in:
@@ -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)) # отрисовка заливки
|
||||
|
||||
@@ -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"]
|
||||
|
||||
Reference in New Issue
Block a user