首页 / JS 脚本手册 / 上下文与状态

上下文与状态

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.shouldRenderboolean该车当前是否在渲染范围内
train.isInDetailDistanceboolean是否在细节渲染距离内
train.previousDoorValuefloat上一帧门开度
train.currentDoorValuefloat当前帧门开度
这四个是字段不是方法,不要写成 train.shouldRender()。 另有同名方法 train.shouldRender()train.shouldRenderDetail() 也可用, 两种写法都成立,但别混。