Files
owniverse/world/Background/background.gd
T

133 lines
4.1 KiB
GDScript
Raw Normal View History

2025-11-12 13:28:57 +03:00
extends Node2D
2025-11-20 10:02:20 +03:00
@export_group("Visual Settings")
2025-11-15 08:22:49 +03:00
@export var STARRY_SKY_LAYER: PackedScene
2025-11-20 10:02:20 +03:00
@export var Star_Count: int = 2000: set = set_star_count
2025-11-12 13:28:57 +03:00
2025-11-20 10:02:20 +03:00
@export var Background_Image_Size: Vector2 = Vector2(1080, 1920):
2025-11-15 08:22:49 +03:00
set = set_Background_Image_Size
@export var Background_Layers: Array [StarrySkyLayer]
var Stars_by_Layers: Dictionary = {}
const BACKGROUND_COLOR: Color = Color.BLACK
2025-11-20 10:02:20 +03:00
const X_SCROLL_RANGE: Vector2 = Vector2(3, 10)
const Y_SCROLL_RANGE: Vector2 = Vector2(1, 5)
const SCALE_FACTOR = 1
2025-11-15 08:22:49 +03:00
const STAR_COLOR_DISTRIBUTION = [
[700, '#8FA8FFFF', 0 ],
[1700, '#8FA8FFD8', 0 ],
[3400, '#8FA8FFA0', 0 ],
[6000, '#A0B5FFFF', 0 ],
[9900, '#A0B5FFD0', 0 ],
[16400, '#A0B5FF90', 0 ],
[17300, '#B0C5FFFF', 0 ],
[18600, '#B0C5FFC8', 0 ],
[20800, '#B0C5FF88', 0 ],
[26000, '#D0DBFFFF', 0 ],
[33800, '#D0DBFFC0', 0 ],
[46800, '#D0DBFF80', 0 ],
[57200, '#F8F7FFE0', 1 ],
[72900, '#F8F7FFA8', 1 ],
[99000, '#F8F7FF70', 1 ],
[114700, '#FFF4EAD0', 1 ],
[138200, '#FFF4EA98', 1 ],
[177400, '#FFF4EA60', 1 ],
[180000, '#FFD280F0', 1 ],
[183000, '#FFD280B8', 1 ],
[189000, '#FFD28078', 1 ],
[191000, '#FFA64DF8', 1 ],
[194000, '#FFA64DC0', 1 ],
[199000, '#FFA64D80', 1 ],
[225000, '#FFE4B5C0', 2 ],
[264000, '#FFE4B588', 2 ],
[309000, '#FFE4B550', 2 ],
[364000, '#FFCC99A0', 2 ],
[441000, '#FFCC9968', 2 ],
[604000, '#FFCC9940', 2 ],
[658000, '#FFB36690', 2 ],
[753000, '#FFB3665C', 2 ],
[893000, '#FFB36630', 2 ],
[914000, '#E8F4FF80', 2 ],
[946000, '#E8F4FF50', 2 ],
[1_000_000, '#E8F4FF28', 2 ],
]
2025-11-12 13:28:57 +03:00
func _ready() -> void:
2025-11-15 08:22:49 +03:00
initiate_layers()
2025-11-20 10:02:20 +03:00
randomize_parallax()
2025-11-15 08:22:49 +03:00
generate_layers()
2025-11-12 13:28:57 +03:00
func _process(delta: float) -> void:
2025-11-20 10:02:20 +03:00
if randi_range(0, 1000) == 0:
randomize_parallax()
func _draw() -> void:
draw_rect(Rect2(Vector2.ZERO, Background_Image_Size), BACKGROUND_COLOR)
2025-11-15 08:22:49 +03:00
func generate_layers():
var max_rnd_seed = STAR_COLOR_DISTRIBUTION[-1][0]
for ind1 in range(Star_Count):
var star_coords = Vector2(randi_range(0, Background_Image_Size.x),
randi_range(0, Background_Image_Size.y))
var rnd_seed = randi_range(0, max_rnd_seed)
for item:Array in STAR_COLOR_DISTRIBUTION:
var item_seed = item[0]
if rnd_seed <= item_seed:
var star_color = Color.html(item[1])
var star_layer = item[2]
Background_Layers[star_layer].Stars.append({
"coords": star_coords,
"color": star_color,
})
break
func initiate_layers():
var layer_count = 0
for item:Array in STAR_COLOR_DISTRIBUTION:
if item[2] > layer_count:
layer_count = item[2]
2025-11-20 10:02:20 +03:00
for ind1 in range(layer_count + 1):
2025-11-15 08:22:49 +03:00
var new_star_layer:StarrySkyLayer = STARRY_SKY_LAYER.instantiate()
2025-11-20 10:02:20 +03:00
add_child(new_star_layer)
2025-11-15 08:22:49 +03:00
new_star_layer.Background_Image_Size = Background_Image_Size
2025-11-20 10:02:20 +03:00
#new_star_layer.autoscroll = (ind1 + 1) * DEFAULT_AUTOSCROL
2025-11-15 08:22:49 +03:00
Background_Layers.append(new_star_layer)
2025-11-20 10:02:20 +03:00
func randomize_parallax():
var x_offset = 0
var y_offset = 0
if _random_sign() == 1:
x_offset = _random_offset(X_SCROLL_RANGE) * _random_sign()
else:
y_offset = _random_offset(Y_SCROLL_RANGE) * _random_sign()
2025-11-15 08:22:49 +03:00
2025-11-20 10:02:20 +03:00
var scale_factor = 1
for layer in Background_Layers:
layer.autoscroll = Vector2(x_offset, y_offset) * scale_factor
scale_factor += SCALE_FACTOR
2025-11-15 08:22:49 +03:00
#region Random offset
2025-11-20 10:02:20 +03:00
func _random_offset(rng: Vector2i) -> int:
return randi_range(rng.x, rng.y)
2025-11-12 13:28:57 +03:00
func _random_sign() -> int:
2025-11-20 10:02:20 +03:00
return [1, -1].pick_random()
2025-11-15 08:22:49 +03:00
#endregion
#region Сеттеры для автоматического обновления
func set_Background_Image_Size(value: Vector2):
Background_Image_Size = value
queue_redraw()
func set_star_count(value: int):
Star_Count = value
queue_redraw()
#endregion