codeНачало работы с CSL

CSL — это собственный язык программирования All Out, созданный для того, чтобы писать многопользовательские игры было так же просто, как создавать одиночные игры.

CSL — это собственный язык сценариев All Out. Он статически типизирован и больше всего похож на Go/Odin — кроме состояние игрового процесса автоматически синхронизируется с сервера на клиенты.

circle-info

Вам не нужно писать RPC, SyncVars или собственную репликацию. Сосредоточьтесь на логике игрового процесса; платформа позаботится о сетевом обмене за вас.

Ваш первый скрипт (main.csl)

Когда вы создаёте новый проект, All Out генерирует main.csl в папке scripts/ в вашем проекте.

import "core:ao"

// ============================================================================
// Глобальный жизненный цикл
// ============================================================================

ao_before_scene_load :: proc() {
    // Зарегистрировать определения предметов, валют и т. д.
    // Выполняется до создания сцены.
}

ao_start :: proc() {
    // Вызывается один раз при запуске сцены.
}

ao_update :: proc(dt: float) {
    // Вызывается каждый кадр.
}

ao_late_update :: proc(dt: float) {
    // Вызывается каждый кадр после ao_update.
}

// ============================================================================
// Жизненный цикл игрока
// ============================================================================

Player :: class : Player_Base {
    ao_start :: method() {
    }

    ao_update :: method(dt: float) {
    }

    ao_late_update :: method(dt: float) {
    }

    ao_end :: method() {
    }
}

Например, выводите сообщение в лог при подключении каждого игрока:

Если хотите подробнее понять, когда выполняются эти функции, см. Жизненный цикл игры/кадра.

Импорты

Ваш main.csl должен импортировать core:ao и любые созданные вами папки (например, ui/, abilities/, и т. д).

circle-exclamation

Объявления (переменные и константы)

Объявления связывают имя со значением.

Переменные

Можно опустить либо <тип> или <выражение> :

Константы

Константы используют :: и должны быть константами времени компиляции:

Это неверно (потому что a не является константой времени компиляции):

Типы

Примитивные типы

  • Знаковые целые числа: s8, s16, s32, s64

  • Беззнаковые целые числа: u8, u16, u32, u64

  • Булевы значения: b8, b16, b32, b64

  • Числа с плавающей точкой: f32, f64

  • Псевдонимы:

    • int == s64

    • uint == u64

    • bool == b8

    • float == f32

  • Векторы: v2, v3, v4

  • string

  • typeid

  • любой

Типы векторов

v2 имеет .x, .y; v3 добавляет .z; v4 добавляет .w — все поля float:

Структуры и классы

Структуры — это тип значения (копируются при присваивании). Классы — это ссылочные типы (их выделяют с помощью new).

Структуры (тип-значение)

Классы (ссылочные типы)

Наследование

Структуры/классы могут наследоваться от других структур/классов:

Процедуры и методы

Процедуры (proc)

Процедуры — это обычные значения, и их можно присваивать/хранить как любое другое значение:

Методы (method)

Используйте method() внутри структуры/класса. У методов есть неявный this параметр-ссылка.

Доступ к полям vs вызовы методов

Используйте . для полей, -> для методов:

circle-info

Любую процедуру можно вызвать как «метод», если её первый параметр совпадает с типом получателя. Это распространённый шаблон CSL.

Массивы

В CSL есть несколько типов, похожих на «массивы», которые вы будете использовать постоянно:

  • Фиксированные массивы: [4]int

  • Срезы / управляемые массивы: []T (часто используется как «только для чтения» представление массива)

  • Динамические массивы: [..]T (изменяемый по размеру список)

  • Неразмещаемые массивы: [^]T (используются в сигнатурах встроенного API, например format_string, log_info, и т. д. — передавайте значения как {a, b, c})

Динамические массивы предоставляют .data, .count, и .capacity, а для операций используют синтаксис вызова метода:

Полное руководство (включая шаблоны удаления) см. Массивы и коллекции.

Управляющий поток

If / else

Switch

While / for / foreach

Приведение типов

Используйте expr.(T) для приведения:

Передача по ссылке: ref (предпочтительно)

Когда вам нужно изменить параметр, предпочитайте ref это вместо сырых указателей.

Колбэки: указатели на функции + userdata (без замыканий)

В CSL нет замыканий. Встроенные proc(...) { ... } не могут захватывать окружающие переменные.

Чтобы передавать контекст, связывайте колбэки с полем userdata: Object

Информация о типах (типы как значения)

typeid значения можно передавать в полиморфные процедуры:

Лучшие практики (CSL в All Out)

  • Избегайте глобального состояния игрового процесса. Подключается несколько игроков — храните состояние каждого игрока в Player вместо этого.

  • Разделяйте косметическую и игровую логику. Используйте is_local() для UI/частиц только на локальном клиенте, и is_local_or_server() для игровых входов, которые должны выполняться на сервере + локальном клиенте.

  • Мобильные настройки по умолчанию. Не полагайтесь на ввод с клавиатуры/мыши, если только ваша игра явно не ориентирована на ПК.

  • Если вы не уверены в синтаксисе или API, проверьте папку api_reference/ сгенерированную в вашем проекте (в ней содержится последняя область core.csl).

Последнее обновление