上下文与状态
state 是你的,ctx 是运行时的。搞清楚哪个存什么,能省掉一半的坑。
state —— 你的存储
每辆车一个独立对象,跨帧保留,create 时为空。放任何你需要跨帧记住的东西:
function create(ctx, state, train) {
state.scrollX = 0;
state.lastStation = null;
state.texture = null;
}
function render(ctx, state, train) {
var now = train.nextStationName();
if (now !== state.lastStation) {
state.lastStation = now;
state.scrollX = 0; // 换站了,重置滚动
}
}
state 在按 F7 重载后清空。
不要把它当持久化存储 —— 需要跨会话保存的东西请用车辆自定义配置(见下)。车辆自定义配置
与 state 不同,这些值会同步到服务端并随存档保留。
| 方法 | 说明 |
|---|---|
train.getCustomConfigs() | 取全部配置,返回 Map<String,String> |
train.putCustomConfig(key, value) | 写入单项 |
train.removeCustomConfig(key) | 删除单项 |
train.setCustomConfigs(map) | 整体替换 |
train.sendCustomConfigsUpdateC2S() | 把改动发往服务端,改完必须调用 |
var cfg = train.getCustomConfigs();
if (cfg.get("pis_lang") !== "zh") {
train.putCustomConfig("pis_lang", "zh");
train.sendCustomConfigsUpdateC2S();
}
写配置不要放在
render 里无条件执行 ——
每帧发包会淹掉网络。先比较、有变化才写。配置响应器
让玩家能在界面里调你的脚本参数:
| 方法 | 说明 |
|---|---|
train.registerCustomConfig(responder) | 注册一个可交互配置项 |
train.getCustomResponders() | 取已注册的全部响应器 |
train.setConfigResponders(map) | 整体替换 |
响应器类型通过全局 ConfigResponder 构造。
ctx —— 运行时上下文
承载绘制调用缓冲区。日常主要用它提交绘制,见绘制 API。
另有两个只读标志可直接从 train 取:
| 属性 | 类型 | 说明 |
|---|---|---|
train.shouldRender | boolean | 该车当前是否在渲染范围内 |
train.isInDetailDistance | boolean | 是否在细节渲染距离内 |
train.previousDoorValue | float | 上一帧门开度 |
train.currentDoorValue | float | 当前帧门开度 |
这四个是字段不是方法,不要写成
train.shouldRender()。
另有同名方法 train.shouldRender() 与 train.shouldRenderDetail() 也可用,
两种写法都成立,但别混。