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

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

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

Переменные

Либо <type> либо <expression> можно опустить:

Константы

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

Это недопустимо (потому что 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

  • any

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

v2, v3, и v4 имеют .x, .y, .z, .w поля типа float:

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

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

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

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

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

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

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

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

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

Методы (method)

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

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

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

circle-info

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

Массивы

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

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

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

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

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

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

Управление потоком выполнения

If / else

Switch

While / for / foreach

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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