Race 2 «Верхние ярусы», фаза 1: карта, вентиляторы, ускоряющие полосы, правила общие с Race
- maps/race2/: сцена, race2.gd (ворота со световыми столбами, лазеры, вентиляторы, полосы, срыв, дождь, гул), данные и модель из Blender models/race_02 (раскладка layout.py -> build_race.py -> bake.py; свет пока запечён грубо, небо и музыка — копии Race) - objects/vent.gd, objects/boost_strip.gd + хуки apply_vent()/apply_boost() в player/player.gd (MAX_SPEED и остальная физика не тронуты) - race_rules.gd берёт данные у карты (общий код правил для Race и Race 2) - портал RACE 2 в хабе, пресет экспорта Race2 + export_all.sh, Net.TIMED_MAPS/MAP_TITLES для race2 (RPC не менялись; серверу нужен deploy_server.sh) - тесты: race_game_test.sh с MAP=race2 (бот проводит игроков телепортами), race2_check.txt - README: раздел «Карта Race 2», результаты ботов по веткам Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -116,6 +116,16 @@ void fragment() {
|
||||
"""
|
||||
|
||||
# Настройки чувствительности мыши
|
||||
# --- Внешние эффекты карт (objects/vent.gd, objects/boost_strip.gd): локально, в сеть не уходят ---
|
||||
const VENT_ACCEL = 60.0 # Подъёмное ускорение в вентиляционном потоке
|
||||
const VENT_MAX_RISE = 11.0 # Поток разгоняет вертикальную скорость не выше этой
|
||||
const BOOST_ACCEL = 60.0 # Разгон на ускоряющей полосе (потолок — MAX_SPEED)
|
||||
const EFFECT_HOLD = 0.12 # Сколько секунд эффект держится после последнего вызова (область зовёт каждый кадр)
|
||||
var vent_timer: float = 0.0
|
||||
var boost_timer: float = 0.0
|
||||
var boost_dir: Vector3 = Vector3.ZERO
|
||||
var boost_speed: float = MAX_SPEED
|
||||
|
||||
@export var MOUSE_SENSITIVITY: float = 0.003
|
||||
|
||||
# --- Настройки тряски камеры (Head Bobbing) ---
|
||||
@@ -418,17 +428,39 @@ func _physics_process(delta: float) -> void:
|
||||
if horizontal.length() > speed_cap:
|
||||
horizontal = horizontal.normalized() * speed_cap
|
||||
|
||||
# Полоса: разгоняет вдоль своего направления, но не выше потолка MAX_SPEED
|
||||
if boost_timer > 0.0:
|
||||
boost_timer -= delta
|
||||
var hs := horizontal.length()
|
||||
if hs > 3.0 and horizontal.normalized().dot(boost_dir) > 0.5:
|
||||
horizontal = horizontal.normalized() * maxf(hs, minf(hs + BOOST_ACCEL * delta, boost_speed)) # только добирает: быстрее полосы не тормозит
|
||||
if horizontal.length() > MAX_SPEED:
|
||||
horizontal = horizontal.normalized() * MAX_SPEED
|
||||
|
||||
velocity.x = horizontal.x
|
||||
velocity.z = horizontal.z
|
||||
|
||||
# Вентиляционный поток: тянет вверх (горизонтальная скорость не трогается), возвращает двойной прыжок
|
||||
if vent_timer > 0.0:
|
||||
vent_timer -= delta
|
||||
velocity.y = minf(velocity.y + VENT_ACCEL * delta, maxf(velocity.y, VENT_MAX_RISE))
|
||||
air_jumps_left = AIR_JUMPS
|
||||
|
||||
# 6. Камера
|
||||
_update_camera(delta, input_dir)
|
||||
|
||||
_move_and_track(delta)
|
||||
|
||||
# Вызывает область-вентилятор каждый физический кадр, пока игрок в потоке
|
||||
func apply_vent() -> void:
|
||||
vent_timer = EFFECT_HOLD
|
||||
|
||||
# Вызывает ускоряющая полоса каждый кадр: dir — куда она разгоняет (горизонтально), speed — до какой скорости
|
||||
func apply_boost(dir: Vector3, speed: float) -> void:
|
||||
boost_timer = EFFECT_HOLD
|
||||
boost_dir = Vector3(dir.x, 0.0, dir.z).normalized()
|
||||
boost_speed = minf(speed, MAX_SPEED)
|
||||
|
||||
# Двигаемся и отслеживаем приземление
|
||||
func _move_and_track(delta: float) -> void:
|
||||
var pre_vy := velocity.y
|
||||
|
||||
Reference in New Issue
Block a user