From e2fb7638c8556fdd321734e62d1651dc5db3b48a Mon Sep 17 00:00:00 2001 From: Antti Hakkarainen Date: Wed, 15 Feb 2023 17:04:06 +0200 Subject: [PATCH] implement camera display marker to minimap --- scenes/CameraMarker.gd | 28 ++++++++++++++++++ scenes/Main.tscn | 8 +++-- scenes/ParcelNoiseTesting.tscn | 26 ++++++++++++++++ scripts/CameraZoom2D.gd | 54 ++++++++++++---------------------- scripts/Minimap.gd | 16 +++++----- scripts/WorldGenerator.gd | 11 +++++-- 6 files changed, 96 insertions(+), 47 deletions(-) create mode 100644 scenes/CameraMarker.gd create mode 100644 scenes/ParcelNoiseTesting.tscn diff --git a/scenes/CameraMarker.gd b/scenes/CameraMarker.gd new file mode 100644 index 0000000..e89f85d --- /dev/null +++ b/scenes/CameraMarker.gd @@ -0,0 +1,28 @@ +extends Sprite2D + +var size_multiplier +var w_s +var previous_camera_zoom + +# draws a box represnting the camera view in minimap +func _draw(): + draw_rect(Rect2(-w_s.x/2, -w_s.y/2, w_s.x, w_s.y), Color.GREEN, false, -3.0) + + +# rotates the box if camera is rotated +func _on_camera_zoom_2d_camera_rotation_changed(new_rotation): + self.rotation = new_rotation + + +# redraws the box to a different size if amera is zoomed +func _on_camera_zoom_2d_camera_zoom_changed(new_zoom_factor): + w_s = (DisplayServer.window_get_size(0) / size_multiplier) + w_s.x /= new_zoom_factor + w_s.y /= new_zoom_factor + queue_redraw() + + +# Sets the initial size of the camera box, after game is loaded +func _on_main_worldgen_ready() -> void: + size_multiplier = Globals.map_size / 32 + w_s = (DisplayServer.window_get_size(0) / size_multiplier) diff --git a/scenes/Main.tscn b/scenes/Main.tscn index c0e4cba..a22b6d3 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -6,7 +6,7 @@ [ext_resource type="PackedScene" uid="uid://2we3txfr812u" path="res://scenes/Camera_zoom_2d.tscn" id="4_rx82t"] [ext_resource type="Script" path="res://scripts/EntityPlacer.gd" id="5_8jju5"] [ext_resource type="Script" path="res://scripts/Minimap.gd" id="5_rg28x"] -[ext_resource type="Texture2D" uid="uid://cxn2fno1j7vf5" path="res://icon.svg" id="7_w68w7"] +[ext_resource type="Script" path="res://scenes/CameraMarker.gd" id="7_0s6ed"] [node name="Main" type="Node2D"] script = ExtResource("1_ysxum") @@ -123,7 +123,8 @@ script = ExtResource("5_rg28x") [node name="CameraMarker" type="Sprite2D" parent="UILayer/Control/Minimap"] z_index = 1 position = Vector2(-32, 0) -texture = ExtResource("7_w68w7") +centered = false +script = ExtResource("7_0s6ed") [node name="MinimapSprite" type="Sprite2D" parent="UILayer/Control/Minimap"] texture_repeat = 1 @@ -133,6 +134,9 @@ centered = false [connection signal="worldgen_ready" from="." to="ChunkHandler" method="_on_main_worldgen_ready"] [connection signal="worldgen_ready" from="." to="CameraZoom2D" method="_on_main_worldgen_ready"] [connection signal="worldgen_ready" from="." to="UILayer/Control/Minimap" method="_on_main_worldgen_ready"] +[connection signal="worldgen_ready" from="." to="UILayer/Control/Minimap/CameraMarker" method="_on_main_worldgen_ready"] +[connection signal="camera_rotation_changed" from="CameraZoom2D" to="UILayer/Control/Minimap/CameraMarker" method="_on_camera_zoom_2d_camera_rotation_changed"] +[connection signal="camera_zoom_changed" from="CameraZoom2D" to="UILayer/Control/Minimap/CameraMarker" method="_on_camera_zoom_2d_camera_zoom_changed"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_residental" to="UILayer/Control" method="_on_button_residental_pressed"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_commercial" to="UILayer/Control" method="_on_button_commercial_pressed"] [connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_industrial" to="UILayer/Control" method="_on_button_industrial_pressed"] diff --git a/scenes/ParcelNoiseTesting.tscn b/scenes/ParcelNoiseTesting.tscn new file mode 100644 index 0000000..099e6f4 --- /dev/null +++ b/scenes/ParcelNoiseTesting.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=3 uid="uid://b3onvgtcvpk3q"] + +[sub_resource type="Gradient" id="Gradient_fu8gh"] +interpolation_mode = 2 + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_54wht"] +noise_type = 5 +frequency = 0.034 +fractal_type = 0 +fractal_octaves = 1 +fractal_lacunarity = 204.627 +fractal_gain = 2.103 +fractal_weighted_strength = 0.32 +cellular_distance_function = 1 +cellular_jitter = 0.884 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_kpv1q"] +generate_mipmaps = false +color_ramp = SubResource("Gradient_fu8gh") +noise = SubResource("FastNoiseLite_54wht") + +[node name="ParcelNoiseTesting" type="Sprite2D"] +position = Vector2(1480, 700) +rotation = 0.523598 +scale = Vector2(2.6875, 2.60938) +texture = SubResource("NoiseTexture2D_kpv1q") diff --git a/scripts/CameraZoom2D.gd b/scripts/CameraZoom2D.gd index 36c9875..d27906a 100644 --- a/scripts/CameraZoom2D.gd +++ b/scripts/CameraZoom2D.gd @@ -2,11 +2,12 @@ class_name CameraZoom2D extends Camera2D +signal camera_rotation_changed(new_rotation) +signal camera_zoom_changed(new_zoom_factor) + var is_panning_camera = false var tween -var _timer:Timer -var camera_bounds:Array = [Vector2(0,0), Vector2(256*16, 256*16)] var chunk_in_px:Vector2i = Vector2i(Globals.CHUNK_SIZE.x*Globals.TILE_SIZE_X, Globals.CHUNK_SIZE.y*Globals.TILE_SIZE_Y) var game_res = DisplayServer.window_get_size(0) var x_min_limit = self.game_res.x/2 - chunk_in_px.x @@ -19,19 +20,6 @@ func _on_main_worldgen_ready() -> void: self.set_limit(SIDE_TOP, -chunk_in_px.y) self.set_limit(SIDE_BOTTOM, Globals.map_size*Globals.TILE_SIZE_Y + chunk_in_px.y) - # create timer for repeating camera rotation - if !_timer: - _timer = Timer.new() - _timer.set_wait_time(0.1) - _timer.set_one_shot(false) - add_child(_timer) - -var is_camera_rotating: bool = false - - -func rotate_camera(step:float) -> void: - self.rotation_degrees += step - func _on_set_camera_position(pos: Vector2) -> void: self.position = pos @@ -52,8 +40,13 @@ func _ready() -> void: pass -func _set_camera_zoom_level(value: float) -> void: - Globals.CAMERA_ZOOM_LEVEL = clamp(value, Globals.CAMERA_MIN_ZOOM_LEVEL, Globals.CAMERA_MAX_ZOOM_LEVEL) +func _set_camera_zoom_level(value: float) -> void: + # keep zoom level in bounds, return if zoom level was at min or max zoom + var new_zoom_level = clamp(value, Globals.CAMERA_MIN_ZOOM_LEVEL, Globals.CAMERA_MAX_ZOOM_LEVEL) + if new_zoom_level == Globals.CAMERA_ZOOM_LEVEL: + return + + Globals.CAMERA_ZOOM_LEVEL = new_zoom_level #interpolate frames between zoom levels to make zooming look smoother tween = get_tree().create_tween() @@ -63,6 +56,8 @@ func _set_camera_zoom_level(value: float) -> void: Vector2(Globals.CAMERA_ZOOM_LEVEL, Globals.CAMERA_ZOOM_LEVEL), Globals.CAMERA_ZOOM_DURATION ) + + emit_signal("camera_zoom_changed", new_zoom_level) func _unhandled_input(event): @@ -85,22 +80,8 @@ func _unhandled_input(event): is_panning_camera = false if event is InputEventMouseMotion and is_panning_camera: - #var new_x = x + d * cos(theta) - #var new_y = y + d * sin(theta) - #self.position -= event.relative * Globals.CAMERA_PAN_MULTI - # √[(x₂ - x₁)² + (y₂ - y₁)²] - - var d = sqrt(pow(event.position.x - 2560/2, 2) + pow(event.position.y - 1440/2, 2)) - - var new_x = self.position.x + d * cos(self.rotation) - var new_y = self.position.y + d * sin(self.rotation) - - #var new_vect = Vector2(new_x, new_y) - - #print ("distance: " , d, " ", new_x, " ", new_y) - - self.position = Vector2(new_x, new_y) - #self.position -= event.relative * Globals.CAMERA_PAN_MULTI + # rotate event.relative vector with camera rotation so camera moves to "correct" direction + self.position -= event.relative.rotated(self.rotation) * Globals.CAMERA_PAN_MULTI # prevent camera from going overboard self.position.x = clamp( @@ -116,7 +97,7 @@ func _unhandled_input(event): func camera_zoom_in() -> void: - _set_camera_zoom_level(Globals.CAMERA_ZOOM_LEVEL - Globals.CAMERA_ZOOM_FACTOR) + _set_camera_zoom_level(Globals.CAMERA_ZOOM_LEVEL - Globals.CAMERA_ZOOM_FACTOR) func camera_zoom_out() -> void: @@ -129,7 +110,10 @@ func get_camera_position(): func reset_camera_rotation() -> void: self.rotation_degrees = 0 + emit_signal("camera_rotation_changed", self.rotation) - +func rotate_camera(step:float) -> void: + self.rotation_degrees += step + emit_signal("camera_rotation_changed", self.rotation) diff --git a/scripts/Minimap.gd b/scripts/Minimap.gd index 9b54542..0fbd357 100644 --- a/scripts/Minimap.gd +++ b/scripts/Minimap.gd @@ -5,8 +5,9 @@ signal set_camera_position(pos:Vector2) @onready var minimap_texture:ImageTexture = null @onready var sprite:Sprite2D -var is_mouse_inside_minimap:bool = false -var position_multiplier +@onready var is_mouse_inside_minimap:bool = false +@onready var position_multiplier +@onready var area_size # Called when the node enters the scene tree for the first time. @@ -28,12 +29,15 @@ func _process(_delta): func _on_main_worldgen_ready(): + # Assuming the area has a child CollisionShape2D with a RectangleShape resource + area_size = self.get_rect().size + + position_multiplier = Globals.map_size / 32 + self.generate_minimap() self.set_minimap() self.setup_camera_marker() - position_multiplier = Globals.map_size / 32 - func _on_mouse_entered(): is_mouse_inside_minimap = true @@ -79,10 +83,6 @@ func generate_minimap() -> void: func set_minimap() -> void: self.sprite = self.find_child("MinimapSprite") self.sprite.texture = minimap_texture - - # Assuming the area has a child CollisionShape2D with a RectangleShape resource - var area_size = self.get_rect() - area_size = area_size.size # The size of a sprite is determined from its texture var texture_size = sprite.texture.get_size() diff --git a/scripts/WorldGenerator.gd b/scripts/WorldGenerator.gd index da0d780..30d569e 100644 --- a/scripts/WorldGenerator.gd +++ b/scripts/WorldGenerator.gd @@ -93,7 +93,12 @@ func generate_biomes() -> void: if noise_sample < 0.1: Globals.map_terrain_data[y][x] = Globals.TILE_FOREST # can add other tresholds here for other biomes - + + +func generate_parcels() -> void: + # divide the land area Cadastres / Parcels + pass + func generate_world(filename) -> bool: var image_size:Vector2i @@ -127,6 +132,8 @@ func generate_world(filename) -> bool: end = Time.get_ticks_usec() print("2/5: smooth water ", (end-start)/1000.0, "ms") + generate_parcels() + start = Time.get_ticks_usec() generate_biomes() end = Time.get_ticks_usec() @@ -135,7 +142,7 @@ func generate_world(filename) -> bool: start = Time.get_ticks_usec() smooth_land_features(Globals.TILE_FOREST) # smooth out forest end = Time.get_ticks_usec() - print("4/5: smooth forest ", (end-start)/1000.0, "ms") + print("4/5: smooth forest ", (end-start)/1000.0, "ms") start = Time.get_ticks_usec() select_tilemap_tiles()