terminalОсновы языка

Для целей этой документации мы используем CSL и среду выполнения/платформу вокруг него как взаимозаменяемые понятия

Эта страница — «сторона моделирования данных» CSL: примитивы, структуры/классы и шаблоны, которые вы будете использовать для аккуратного представления состояния игры.

circle-info

Если вы совсем новичок, начните с Начало работы с CSL. На этой странице предполагается, что вы уже знаете, как объявлять переменные и писать proc/method.

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

Числа и булевы значения

  • Знаковые целые числа: s8, s16, s32, s64 (псевдоним: int == s64)

  • Беззнаковые целые числа: u8, u16, u32, u64 (псевдоним: uint == u64)

  • Числа с плавающей точкой: f32 (псевдоним: float), f64

  • Булевы значения: b8 (псевдоним: bool), b16, b32, b64

health: int = 100;
speed: float = 6.5;
is_dead: bool = false;

Строки

string постоянно используется для ID, имён и форматирования.

item_id := "sword";
log_info("подобран %", {item_id});

Векторы

v2, v3, v4 — это встроенные математические/данные типы:

Перечисления

Перечисления отлично подходят для читаемых полей «режим/состояние»:

circle-info

Значения перечисления обычно обращаются через сокращённую форму .VALUE когда компилятор может вывести тип перечисления.

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

Используйте структуры для «простых данных», которые вы хотите дешёво копировать (конфиги, небольшие блоки состояния, дескрипторы).

Когда использовать структуру

  • Объект-дескриптор/конфиг (*_Desc)

  • Небольшое, самодостаточное состояние, которое вы хотите копировать по значению

  • Данные, которые вы хотите вложить внутрь другого типа

Когда не стоит использовать структуру

  • Большое изменяемое состояние, разделяемое между несколькими системами (используйте класс)

  • Объекты «с идентичностью» (игроки, предметы, долго живущие объекты) (используйте класс)

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

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

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

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

circle-exclamation

Массивы, срезы и динамические массивы

Вы увидите три распространённые формы:

  • Фиксированные массивы: [N]T (размер на этапе компиляции)

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

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

Пример:

Полное руководство см. в Массивы и коллекции.

Передача по ссылке (ref)

Если процедуре нужно изменить значение, используйте ref:

Это особенно полезно для API в стиле «разметки», которые постепенно обрезают/уменьшают прямоугольник:

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

Используйте expr.(T):

Типовой полиморфизм (процедуры в стиле обобщений)

CSL поддерживает полиморфные процедуры с использованием $ чтобы определить типы в месте вызова:

Типы как значения (typeid)

typeid — это значение, которое представляет тип во время выполнения и/или для полиморфных вызовов:

Практические рекомендации по моделированию

  • Состояние, специфичное для игрока, хранится в Player. Если оно должно различаться между игроками, оно не должно быть глобальным.

  • Для дескрипторов предпочитайте небольшие структуры а состояние времени выполнения храните в классах/компонентах.

  • Сохраняйте данные, авторитетные для сервера, авторитетными. Если это влияет на геймплей, не вычисляйте это только на клиенте.

Для шаблонов, специфичных для игрока, см. Добавление логики игрока. Для стороны ECS в мире см. Сущности и компоненты.

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