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

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

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

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 используется постоянно для идентификаторов, имён и форматирования.

item_id := "sword";
log_info("picked up %", {item_id});

Векторы

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

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

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

circle-info

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

Structs (значимые типы)

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

Когда использовать struct

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

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

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

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

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

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

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

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

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

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

circle-exclamation

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

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

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

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

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

Пример:

Для полного руководства см. Массивы и коллекции.

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

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

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

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

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

Полиморфизм типов (процедуры в стиле generics)

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

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

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

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

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

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

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

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

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