For the complete documentation index, see llms.txt. This page is also available as Markdown.

语言基础

CSL 基本类型、枚举、结构体、类、引用和多态。

本页介绍 CSL 的“数据建模”一侧:原始类型、结构体/类,以及你将用来清晰表示游戏状态的模式。

如果你是新手,请先看 CSL 入门. 本页假定你已经知道如何声明变量并编写 proc/method.

原始类型

数字和布尔值

  • 有符号整数: s8, s16, s32, s64 (别名: int == s64)

  • 无符号整数: u8, u16, u32, u64 (别名: uint == u64)

  • 浮点数: f32 (别名: float), f64

  • 布尔值: bool

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

CSL 在安全时会扩大数字类型:较小的有符号整数可以变为更大的有符号整数,较小的无符号整数可以变为更大的无符号整数,当目标类型能够容纳完整范围时,无符号整数可以变为更大的有符号整数,并且 f32 可以变为 f64.

字符串

string 经常用于 ID、名称和格式化。

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

向量

v2, v3, v4 是内置的数学/数据类型:

枚举

枚举非常适合用于可读的“模式/状态”字段:

当编译器能够推断枚举类型时,枚举值通常会用简写 .VALUE 来引用。

结构体(值类型)

当你想要以较低成本到处拷贝的“纯数据”时,使用结构体(配置、小型状态块、描述符)。

结构体可以继承其他结构体。复合字面量会先包含继承来的字段:

何时使用结构体

  • 描述符/配置对象(*_Desc)

  • 小型、独立的状态,你希望按值复制

  • 你想嵌入到另一种类型中的数据

何时不要使用结构体

  • 在多个系统之间共享的大型可变状态(用类)

  • “身份”对象(玩家、物品、长期存在的对象)(用类)

类(引用类型)

类是引用类型。使用 new(...).

继承

你可以继承其他结构体/类:

派生类会继承默认字段值。它们可以在类体中用 field = value 覆盖继承来的默认值:

数组、切片和动态数组

你会看到三种常见形式:

  • 固定数组: [N]T (编译时大小)

  • 切片 / 托管数组: []T (数组的视图)

  • 动态数组: [..]T (可调整大小的列表)

示例:

完整指南请参见 数组和集合.

按引用传递(ref)

如果某个过程需要修改值,请使用 ref:

这对于那种会逐步裁切/缩小矩形的“布局风格” API 特别有用:

类型转换

使用 expr.(T)cast(T)expr:

当目标类型已经已知时, expr.()cast expr 会推断目标类型。

类型多态(类似泛型的过程)

CSL 支持使用 $ 在调用点推导类型:

类型作为值(typeid)

typeid 是一个在运行时和/或用于多态调用时表示某个类型的值:

value.#type 会返回类值的运行时类型。当你从基类向下转换时,如果精确的派生类型很重要,请先使用它。

实用建模指南

  • 每个玩家的状态保存在 Player. 如果它在不同玩家之间应该不同,就不应该是全局的。

  • 描述符优先使用小型结构体 并将运行时状态存放在类/组件中。

  • 在共享的预测路径中运行游戏逻辑。 不要只在 is_local() 下计算游戏状态,也不要用 Game.is_server().

对于玩家特定模式,请参见 添加玩家逻辑. 关于世界的 ECS 侧,请参见 实体与组件.

最后更新于