Геймпад Xbox, меню паузы с настройками, новый хаб с музыкой
- Геймпад: раскладка под паркур и гонки, обзор правым стиком, навигация по меню (A/B/крестовина) - Меню паузы (Esc/Start): выход в хаб, настройки (мышь, стик, FOV, громкость, инверсия), справка по управлению - Хаб 48x32x10 м: колонны, окна с городом, голограмма, лавки; музыка «Local Forecast - Elevator» (Kevin MacLeod, CC-BY) - Тесты: pause_test, pad_menu_test, hub_tour; README обновлён Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
+48
-14
@@ -1,7 +1,8 @@
|
||||
extends Node3D
|
||||
# Стартовая комната: ничего тяжёлого, только пол, стены и порталы на карты. Сами карты качаются
|
||||
# отдельными пакетами при входе в портал (World/map_loader.gd) — поэтому игра стартует быстро.
|
||||
# Чтобы добавить карту — допиши запись в PORTALS: порталы встанут в ряд по центру (влезает 6).
|
||||
# Чтобы добавить карту — допиши запись в PORTALS: порталы встанут в ряд по центру (влезает 7).
|
||||
# Оформление (колонны, окна, голограмма, лавки) — hub_decor.gd; музыка «как в лифте» играет по кругу.
|
||||
|
||||
const PORTALS := [
|
||||
{"title": "SANDBOX", "map": "world", "scene": "res://maps/sandbox/sandbox.tscn", "pack": "world.pck", "color": Color(0.2, 0.9, 1.0)},
|
||||
@@ -11,11 +12,15 @@ const PORTALS := [
|
||||
{"title": "RACE 2", "map": "race2", "scene": "res://maps/race2/race2.tscn", "pack": "race2.pck", "color": Color(0.45, 0.85, 0.35)},
|
||||
]
|
||||
|
||||
const ROOM_WIDTH := 28.0
|
||||
const ROOM_DEPTH := 18.0
|
||||
const ROOM_HEIGHT := 7.0 # +1 м: над порталами доски рейтинга, над ними — «CHOOSE A MAP»
|
||||
const ROOM_WIDTH := 48.0
|
||||
const ROOM_DEPTH := 32.0
|
||||
const ROOM_HEIGHT := 10.0 # над порталами доски рейтинга, над ними — «CHOOSE A MAP»
|
||||
const WALL := 0.5
|
||||
const PORTAL_SPACING := 4.5
|
||||
const PORTAL_SPACING := 6.0
|
||||
|
||||
const MUSIC_PATH := "res://maps/hub/audio/music.ogg"
|
||||
const MUSIC_DB := -9.0
|
||||
const DecorScript := preload("res://maps/hub/hub_decor.gd")
|
||||
|
||||
const GRID_SHADER := """
|
||||
shader_type spatial;
|
||||
@@ -37,6 +42,8 @@ func _ready() -> void:
|
||||
_build_portals()
|
||||
_build_environment()
|
||||
_build_boards()
|
||||
_build_decor()
|
||||
_start_music()
|
||||
if not Net.nick_asked:
|
||||
Overlay.open_nick.call_deferred(true) # первый запуск: спрашиваем ник
|
||||
|
||||
@@ -45,11 +52,14 @@ func _build_room() -> void:
|
||||
body.name = "Room"
|
||||
add_child(body)
|
||||
|
||||
var floor_mat := ShaderMaterial.new()
|
||||
floor_mat.shader = Shader.new()
|
||||
floor_mat.shader.code = GRID_SHADER
|
||||
var decor := DecorScript.new()
|
||||
decor.name = "Decor"
|
||||
add_child(decor)
|
||||
var floor_mat := decor.floor_material()
|
||||
var wall_mat := StandardMaterial3D.new()
|
||||
wall_mat.albedo_color = Color(0.09, 0.1, 0.14)
|
||||
wall_mat.albedo_color = Color(0.12, 0.13, 0.18)
|
||||
wall_mat.metallic = 0.3
|
||||
wall_mat.roughness = 0.6
|
||||
wall_mat.roughness = 1.0
|
||||
var ceiling_mat := StandardMaterial3D.new()
|
||||
ceiling_mat.albedo_color = Color(0.05, 0.055, 0.08)
|
||||
@@ -102,7 +112,8 @@ func _build_portals() -> void:
|
||||
label.font_size = 64
|
||||
label.outline_size = 12
|
||||
label.modulate = Color(0.7, 0.9, 1.0)
|
||||
label.position = Vector3(0, ROOM_HEIGHT - 0.35, -ROOM_DEPTH * 0.5 + 0.1)
|
||||
label.position = Vector3(0, 7.2, -ROOM_DEPTH * 0.5 + 0.1)
|
||||
label.pixel_size = 0.016
|
||||
add_child(label)
|
||||
|
||||
# ---------- доски рейтинга над порталами карт «на время» ----------
|
||||
@@ -206,15 +217,38 @@ func _build_environment() -> void:
|
||||
env.background_color = Color(0.02, 0.025, 0.04)
|
||||
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
|
||||
env.ambient_light_color = Color(0.5, 0.58, 0.75)
|
||||
env.ambient_light_energy = 0.55
|
||||
env.ambient_light_energy = 1.0
|
||||
env.glow_enabled = true # неон и светильники светятся (в Compatibility glow работает)
|
||||
env.glow_intensity = 0.8
|
||||
env.glow_bloom = 0.1
|
||||
var we := WorldEnvironment.new()
|
||||
we.environment = env
|
||||
add_child(we)
|
||||
|
||||
var lamp := OmniLight3D.new()
|
||||
lamp.position = Vector3(0, ROOM_HEIGHT - 0.6, 2.0)
|
||||
lamp.omni_range = 22.0
|
||||
lamp.light_energy = 0.8
|
||||
lamp.position = Vector3(0, ROOM_HEIGHT - 0.8, -6.0)
|
||||
lamp.omni_range = 30.0
|
||||
lamp.light_energy = 0.9
|
||||
lamp.light_color = Color(0.8, 0.9, 1.0)
|
||||
lamp.shadow_enabled = false
|
||||
add_child(lamp)
|
||||
|
||||
# ---------- оформление и музыка ----------
|
||||
|
||||
func _build_decor() -> void:
|
||||
var decor := get_node("Decor")
|
||||
decor.build(ROOM_WIDTH, ROOM_DEPTH, ROOM_HEIGHT)
|
||||
|
||||
func _start_music() -> void:
|
||||
var stream = load(MUSIC_PATH)
|
||||
if stream == null:
|
||||
return
|
||||
if stream is AudioStreamOggVorbis:
|
||||
stream.loop = true
|
||||
var player := AudioStreamPlayer.new()
|
||||
player.name = "Music"
|
||||
player.stream = stream
|
||||
player.volume_db = -40.0
|
||||
player.autoplay = true
|
||||
add_child(player)
|
||||
create_tween().tween_property(player, "volume_db", MUSIC_DB, 3.0) # плавно нарастает
|
||||
|
||||
Reference in New Issue
Block a user