Жизненный цикл игры/кадра
В отличие от сценариев, основанных на событиях, как в Roblox, игры в All Out используют модель жизненного цикла кадров, которая позволяет запускать код при старте игры, на каждом кадре и в конце сессии.
Последнее обновление
В отличие от сценариев, основанных на событиях, как в Roblox, игры в All Out используют модель жизненного цикла кадров, которая позволяет запускать код при старте игры, на каждом кадре и в конце сессии.
Игры All Out работают по простому жизненному циклу: некоторые колбэки вызываются один раз при запуске, а некоторые — каждый кадр.
Эти колбэки вы реализуете либо:
Глобально (на верхнем уровне ao_* процедурах в main.csl), или
На компонентах (методы вроде ao_update этого игрока Player или ваших собственных Component подклассов)
Если вы ищете «шаблон» main.csl, см. Начало работы с CSL.
Это процедуры верхнего уровня в main.csl:
ao_before_scene_loadЗапускается после того, как пустой Сцена создаётся, но до загрузки его сериализованных сущностей и компонентов. Здесь обычно регистрируют определения, необходимые во время загрузки сцены:
Определения предметов (система инвентаря)
Валюты (экономическая система)
Глобальные значения/константы конфигурации
ao_startЗапускается один раз при старте сцены.
Типичные случаи использования:
Создание сущностей/префабов во время выполнения
Инициализация глобальных систем
Чтение общих данных сохранения игры
ao_update(dt)Запускается каждый кадр.
Типичные случаи использования:
Игровые таймеры, менеджеры волн
Логика спавна, зависящая от времени
Правила геймплея
ao_late_update(dt)Запускается каждый кадр после ao_update.
Типичные случаи использования:
Работа на уровне всей сцены, зависящая от итоговых позиций/состояния кадра
Работа по «очистке» после обновлений
Интерфейс игрока должен находиться в Player.ao_late_update, а не в этом глобальном колбэке.
Компоненты (включая Player) могут реализовывать:
ao_start()
ao_update(dt)
ao_late_update(dt)
ao_end()
ao_on_state_sync() (вызывается, когда сетевое состояние синхронизировано)
ao_start() не воспроизводится для каждого клиента. Когда клиент подключается после того, как объект уже был запущен на сервере, синхронизированный компонент может прийти уже с завершённым жизненным циклом запуска. Не используйте ao_start() для локальной на клиенте настройки отображения, которую должен выполнить каждый подключающийся клиент; воссоздавайте это отображение из синхронизированного состояния в ao_on_state_sync() вместо этого.
Пример:
Состояние/логика для каждого игрока: размещайте это на Player (см. Добавление логики игрока)
Повторно используемое поведение сущностей: размещайте их в пользовательских компонентах (см. Сущности и компоненты)
Глобальная координация / правила: размещайте это в глобальном жизненном цикле (ao_* процедуры)
Глобальные и компонентные игровые колбэки выполняются и на предсказывающем клиенте, и на сервере. Не защищайте игровой процесс с помощью Game.is_server().
Рисуйте весь UI игрока из ao_late_update стека вызовов, обёрнутых в is_local_or_server(). Используйте is_local() только для визуальных переопределений, специфичных для игрока. Состояние, изменённое только под is_local() заменяется следующей серверной синхронизацией.
Это методы в Player_Base. Вызывайте их у ссылки на игрока или как is_local_or_server() / is_local() внутри Player метода (неявно this).
Последнее обновление
Orbiter :: class : Component {
ao_start :: method() {
// инициализация
}
ao_update :: method(dt: float) {
// поведение каждый кадр
}
ao_end :: method() {
// очистка (при уничтожении)
}
}