目录

JavaScript 列车相关

NTE 支持通过 JavaScript 控制列车的渲染全过程。既可以完全用 JavaScript 控制所有部件的渲染,也可以在现有的一个列车类型的显示模型的基础上叠加用 JavaScript 控制的显示内容。

添加车型

mtr_custom_resources.json 里使用这样写法即可添加使用 JavaScript 控制渲染的车型。

{
  "custom_trains": {
    "s_train_suspend": {
      "name": "JS Test Train",
      "base_type": "train_9_2",
      "color": "2AF0AD",
      "script_files": [ "mtr:js_train/main.js" ],
      "bve_sound_base_id": "optonix1500"
    }
  }
}

可包含的内容和 MTR 原版添加车型时的相同,相当于写一个标准的 MTR 自定义列车,然后再添加 script_files 属性。

如果不含有 base_type 这个参数,将首先原样显示由其余内容设定的列车外观,然后把 JavaScript 控制的渲染内容叠加在上面。如果含有 base_type 这个参数,则会纯粹用 JavaScript 来显示它的外观。

属性 说明
basetype | 列车的交通类型、长度和宽度。如 train_19_2。如果有这个属性,会纯粹用 JavaScript 来显示它的外观,即忽略 base_train_typemodel 等参数;否则会按照base_train_typemodel 等显示一个外观再把 JavaScript 控制的内容叠加在上面。 | | scriptfiles 一个数组,包含要使用的 JS 文件的资源位置。可以使用多个 JS 文件。
scripttexts | 可选,一个数组,包含要运行的一些 JS 纯文本内容(会在 scriptfiles 之前运行)。可以用于需要给多个列车使用同一脚本,而又想设定一些各个列车之间不相同的设定的情况。
hasgangwayconnection 是否可以通过贯通道走到其他车厢。没有这项时采取 basetraintype 的设置。
isjacobsbogie 是否是铰接转向架。只影响 BVE 列车音效的轮轨声音播放。
bogie_position 非铰接的转向架距离车中点的距离。只影响 BVE 列车音效的轮轨声音播放。

全局环境

同一车型的所有列车共享同一个运行环境(即全局变量等)。

写在函数以外的顶层空间内的代码会在资源包加载时运行,可用于加载模型、贴图等资源。推荐将不需要每列车都不同的资源(如模型等)存储在全局变量,避免相同内容每列车都加载一份带来过多内存占用。

您要定义的函数

您的脚本中应包含以下函数,NTE 会按需调用它们:

function create(ctx, state, train) { ... }
function render(ctx, state, train) { ... }
function dispose(ctx, state, train) { ... }
函数 说明
create 在列车最开始被加载时调用,可用于进行一些初始化的操作,例如创建动态贴图。
render 大致每帧调用一次。用于主要的显示逻辑。代码在单独线程上运行以便不拖低 FPS。如果代码耗时太长,就可能实际上好几帧才运行一次。
dispose 在列车驶出可视范围时调用。可用于释放动态贴图之类的操作。

NTE 调用这几个函数时会使用三个参数,稍后介绍其各自的内容。

参数 (本文中称呼) 说明
第一个 (ctx) 用于向 NTE 输出要如何渲染列车的相关操作。类型是 TrainScriptContext。
第二个 (state) 一个和某列车关联的 JavaScript 对象。初始值是 {},可随意设置其上的成员,用来存储一些需要每列车都不同的内容。
第三个 (train) 用于获取列车的状态。类型是 Train。

接下来列出您可以进行的所有渲染控制操作,和可以获取到的所有关于列车的信息。

TrainScriptContext

调用以下函数可以控制渲染。每次 render 时都需要为想绘制的模型调用相应的函数,