implement camera display marker to minimap
This commit is contained in:
parent
d0f0d8c009
commit
e2fb7638c8
6 changed files with 96 additions and 47 deletions
28
scenes/CameraMarker.gd
Normal file
28
scenes/CameraMarker.gd
Normal file
|
@ -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)
|
|
@ -6,7 +6,7 @@
|
||||||
[ext_resource type="PackedScene" uid="uid://2we3txfr812u" path="res://scenes/Camera_zoom_2d.tscn" id="4_rx82t"]
|
[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/EntityPlacer.gd" id="5_8jju5"]
|
||||||
[ext_resource type="Script" path="res://scripts/Minimap.gd" id="5_rg28x"]
|
[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"]
|
[node name="Main" type="Node2D"]
|
||||||
script = ExtResource("1_ysxum")
|
script = ExtResource("1_ysxum")
|
||||||
|
@ -123,7 +123,8 @@ script = ExtResource("5_rg28x")
|
||||||
[node name="CameraMarker" type="Sprite2D" parent="UILayer/Control/Minimap"]
|
[node name="CameraMarker" type="Sprite2D" parent="UILayer/Control/Minimap"]
|
||||||
z_index = 1
|
z_index = 1
|
||||||
position = Vector2(-32, 0)
|
position = Vector2(-32, 0)
|
||||||
texture = ExtResource("7_w68w7")
|
centered = false
|
||||||
|
script = ExtResource("7_0s6ed")
|
||||||
|
|
||||||
[node name="MinimapSprite" type="Sprite2D" parent="UILayer/Control/Minimap"]
|
[node name="MinimapSprite" type="Sprite2D" parent="UILayer/Control/Minimap"]
|
||||||
texture_repeat = 1
|
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="ChunkHandler" method="_on_main_worldgen_ready"]
|
||||||
[connection signal="worldgen_ready" from="." to="CameraZoom2D" 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" 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_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_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"]
|
[connection signal="pressed" from="UILayer/Control/ConstructionPanel/button_industrial" to="UILayer/Control" method="_on_button_industrial_pressed"]
|
||||||
|
|
26
scenes/ParcelNoiseTesting.tscn
Normal file
26
scenes/ParcelNoiseTesting.tscn
Normal file
|
@ -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")
|
|
@ -2,11 +2,12 @@
|
||||||
class_name CameraZoom2D
|
class_name CameraZoom2D
|
||||||
extends Camera2D
|
extends Camera2D
|
||||||
|
|
||||||
|
signal camera_rotation_changed(new_rotation)
|
||||||
|
signal camera_zoom_changed(new_zoom_factor)
|
||||||
|
|
||||||
var is_panning_camera = false
|
var is_panning_camera = false
|
||||||
var tween
|
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 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 game_res = DisplayServer.window_get_size(0)
|
||||||
var x_min_limit = self.game_res.x/2 - chunk_in_px.x
|
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_TOP, -chunk_in_px.y)
|
||||||
self.set_limit(SIDE_BOTTOM, Globals.map_size*Globals.TILE_SIZE_Y + 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:
|
func _on_set_camera_position(pos: Vector2) -> void:
|
||||||
self.position = pos
|
self.position = pos
|
||||||
|
@ -52,8 +40,13 @@ func _ready() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
func _set_camera_zoom_level(value: float) -> void:
|
func _set_camera_zoom_level(value: float) -> void:
|
||||||
Globals.CAMERA_ZOOM_LEVEL = clamp(value, Globals.CAMERA_MIN_ZOOM_LEVEL, Globals.CAMERA_MAX_ZOOM_LEVEL)
|
# 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
|
#interpolate frames between zoom levels to make zooming look smoother
|
||||||
tween = get_tree().create_tween()
|
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),
|
Vector2(Globals.CAMERA_ZOOM_LEVEL, Globals.CAMERA_ZOOM_LEVEL),
|
||||||
Globals.CAMERA_ZOOM_DURATION
|
Globals.CAMERA_ZOOM_DURATION
|
||||||
)
|
)
|
||||||
|
|
||||||
|
emit_signal("camera_zoom_changed", new_zoom_level)
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event):
|
func _unhandled_input(event):
|
||||||
|
@ -85,22 +80,8 @@ func _unhandled_input(event):
|
||||||
is_panning_camera = false
|
is_panning_camera = false
|
||||||
|
|
||||||
if event is InputEventMouseMotion and is_panning_camera:
|
if event is InputEventMouseMotion and is_panning_camera:
|
||||||
#var new_x = x + d * cos(theta)
|
# rotate event.relative vector with camera rotation so camera moves to "correct" direction
|
||||||
#var new_y = y + d * sin(theta)
|
self.position -= event.relative.rotated(self.rotation) * Globals.CAMERA_PAN_MULTI
|
||||||
#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
|
|
||||||
|
|
||||||
# prevent camera from going overboard
|
# prevent camera from going overboard
|
||||||
self.position.x = clamp(
|
self.position.x = clamp(
|
||||||
|
@ -116,7 +97,7 @@ func _unhandled_input(event):
|
||||||
|
|
||||||
|
|
||||||
func camera_zoom_in() -> void:
|
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:
|
func camera_zoom_out() -> void:
|
||||||
|
@ -129,7 +110,10 @@ func get_camera_position():
|
||||||
|
|
||||||
func reset_camera_rotation() -> void:
|
func reset_camera_rotation() -> void:
|
||||||
self.rotation_degrees = 0
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,9 @@ signal set_camera_position(pos:Vector2)
|
||||||
|
|
||||||
@onready var minimap_texture:ImageTexture = null
|
@onready var minimap_texture:ImageTexture = null
|
||||||
@onready var sprite:Sprite2D
|
@onready var sprite:Sprite2D
|
||||||
var is_mouse_inside_minimap:bool = false
|
@onready var is_mouse_inside_minimap:bool = false
|
||||||
var position_multiplier
|
@onready var position_multiplier
|
||||||
|
@onready var area_size
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
@ -28,12 +29,15 @@ func _process(_delta):
|
||||||
|
|
||||||
|
|
||||||
func _on_main_worldgen_ready():
|
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.generate_minimap()
|
||||||
self.set_minimap()
|
self.set_minimap()
|
||||||
self.setup_camera_marker()
|
self.setup_camera_marker()
|
||||||
|
|
||||||
position_multiplier = Globals.map_size / 32
|
|
||||||
|
|
||||||
|
|
||||||
func _on_mouse_entered():
|
func _on_mouse_entered():
|
||||||
is_mouse_inside_minimap = true
|
is_mouse_inside_minimap = true
|
||||||
|
@ -79,10 +83,6 @@ func generate_minimap() -> void:
|
||||||
func set_minimap() -> void:
|
func set_minimap() -> void:
|
||||||
self.sprite = self.find_child("MinimapSprite")
|
self.sprite = self.find_child("MinimapSprite")
|
||||||
self.sprite.texture = minimap_texture
|
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
|
# The size of a sprite is determined from its texture
|
||||||
var texture_size = sprite.texture.get_size()
|
var texture_size = sprite.texture.get_size()
|
||||||
|
|
|
@ -93,7 +93,12 @@ func generate_biomes() -> void:
|
||||||
if noise_sample < 0.1:
|
if noise_sample < 0.1:
|
||||||
Globals.map_terrain_data[y][x] = Globals.TILE_FOREST
|
Globals.map_terrain_data[y][x] = Globals.TILE_FOREST
|
||||||
# can add other tresholds here for other biomes
|
# can add other tresholds here for other biomes
|
||||||
|
|
||||||
|
|
||||||
|
func generate_parcels() -> void:
|
||||||
|
# divide the land area Cadastres / Parcels
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
func generate_world(filename) -> bool:
|
func generate_world(filename) -> bool:
|
||||||
var image_size:Vector2i
|
var image_size:Vector2i
|
||||||
|
@ -127,6 +132,8 @@ func generate_world(filename) -> bool:
|
||||||
end = Time.get_ticks_usec()
|
end = Time.get_ticks_usec()
|
||||||
print("2/5: smooth water ", (end-start)/1000.0, "ms")
|
print("2/5: smooth water ", (end-start)/1000.0, "ms")
|
||||||
|
|
||||||
|
generate_parcels()
|
||||||
|
|
||||||
start = Time.get_ticks_usec()
|
start = Time.get_ticks_usec()
|
||||||
generate_biomes()
|
generate_biomes()
|
||||||
end = Time.get_ticks_usec()
|
end = Time.get_ticks_usec()
|
||||||
|
@ -135,7 +142,7 @@ func generate_world(filename) -> bool:
|
||||||
start = Time.get_ticks_usec()
|
start = Time.get_ticks_usec()
|
||||||
smooth_land_features(Globals.TILE_FOREST) # smooth out forest
|
smooth_land_features(Globals.TILE_FOREST) # smooth out forest
|
||||||
end = Time.get_ticks_usec()
|
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()
|
start = Time.get_ticks_usec()
|
||||||
select_tilemap_tiles()
|
select_tilemap_tiles()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue