Trainz/情景(脚本化活动)
词汇表 |
HKeys-CM |
HKeys-DVR |
HKeys-SUR |
HKeys-WIN |
鼠标使用 |
符号 |
操作说明:点击正文中的脚注 ([2]) 或注释标签 ([note 12]) 会将您导航(定位页面)至该条目的确切文本。 • 然后:点击那里的?符号,将带您返回到您开始阅读的地方。 |
- Trainz-情景将在 Trainz/Trainz:新纪元 (TANE) (TS12 后 64 位版本,由 2014 年 12 月下载的 Beta '社区版' 发布,标准版(也是 Beta 版)于 2015 年 5 月发布;预计 2015 年夏季末发布第一个服务包改进。
- Trainz 中的第一次游戏玩法
一个虚构中的情景 有一个众所周知的含义,指的是一个包含背景故事和情境的事件,主角必须以某种方式应对。这个广泛的定义虽然在 Trainz 中以同样的广泛意义适用,但实际上有两种机制来呈现 Trainz 的游戏玩法,即软件套件中的游戏玩法:操作员在驾驶员会话中应该执行的任务,一个目标,或者问题。简而言之,一个有使命要完成的任务。一个写得好的任务会提供某种“积分”评分,让你可以将自己的表现与标准和自己的最高得分进行比较。写得好的任务也会清晰地概述任务、结束条件,并假定驾驶员(我们)事先不知道路线/布局。大多数任务没有满足这些标准。此外,写得好的任务允许你重新打开说明并刷新记忆,并将名称(有时听起来很奇怪)与小地图标签进行比较。
它们还提供了情境修正器,有一次将货物列车开往时间表,结果却发现对列车编组位置的误判(导致倒车速度降低了大约四五分钟),要求驾驶员赶上时间——但为了小心地保持低于公布的速度限制,会话编写者并没有费心告诉我们在那个国家,当速度达到一定范围时,速度限制会自动降低,这意味着货物列车必须在达到这些范围时低于公布的速度限制 10、15 或 25 英里。像许多这样的问题任务一样,这个任务会因为超速而扣分。你是否会永远记住将货物列车按时开到最后几个站点的经历,完成它并发现你的最终得分是-384(从 800+ 上次注意到/检查时!)下降的?
这些游戏玩法任务序列中的较旧序列实际上在 2001-2002 年由 Auran 称为情景(以下称为“Trainz-情景”),而较新的模式被称为会话。从 Trainz 中驾驶员的游戏玩法的角度来看,除了一个区别之外,几乎没有区别:它们在驾驶员菜单中的显示方式不同。从创建两者之一的角度来看,差异很大。
Trainz-情景是用户在 Trainz 驾驶员 GUI 模块中操作的交互式脚本化活动——这是该软件系统提供的各种娱乐形式中最像游戏的一种。它们总是会有特定的完成目标或状态,并且许多情景的编写都提供了评分,让驾驶员有机会与其他人竞争或打破她之前的最高得分。它们在本质上差异很大,一些情景为操作的每个阶段提供逐步说明(例如,关于如何运行 Trainz 的教程),而另一些情景只是显示目标的详细信息,并将其留给用户去想出一个实现目标的方法。“调车谜题情景”,也许是最现实的 Trainz 驾驶员“任务”或“问题”模型 “典型的铁路运营” 倾向于采用后一种风格。一些“时间表保持挑战”遵循简洁的模式,在驾驶员情景启动时只提供一个时间表。各种各样的事件可以在 Trainz-情景中触发。可以显示 HTML 文本和图像,播放声音,在“天外飞来”的情况下添加列车(在几分钟前在地图上不可见),或者改变机车的装载状态。
在最早的 Trainz 中,使用 TrainzScript.exe 编写的 Trainz-情景,这是一个单独的实用程序,不再作为 TRS2006 及以后版本的一部分提供,基于脚本语言的情景对于在“镜头外”装载煤炭车或其他货物至关重要,因此非常适合反映许多短途或调车机车“调车”操作的现实情况,在这种情况下,机车在各个地点装卸货车,并将装载或卸载的机车运回集结场或分类场,在那里将其适当的调入或调出较长的区域列车。但 TRS2004 还引入了互动产业(在 2003 年)和会话编辑器以及驾驶员规则改进,同时仍然完全支持 Trainz-情景。从那时起,版本可能最好被视为“只读”实现,其中下载的 Trainz-情景仍然可以播放,但不能编写。
|
Trainz-情景是在 服务包 3 发布时引入的,该服务包面向原始 Trainz 版本以及 Trainz UTC,并且是让许多资深 Trainz 用户认为 Trainz 1.3 版本是第二个独立的主要版本的主要改进之一。情景在 TRS2004 中得到了完全支持,作为一种替代的向后兼容的脚本化活动模式……即使该版本引入了新的、更通用的 会话'。它们只在 TRS2006 和 Trainz Classics 到最新的 Trainz Trainz 2012 中得到部分支持,这意味着现有的会话(通常)仍然可以在导入或下载时运行,但 TrainzScript 软件实用程序既没有更新,也没有作为这些更新版本的一部分提供,因为'会话'更加灵活,并且可以执行旧的 Trainz-情景技术可以执行的所有操作。换句话说(比较上面的内容与情景):“Trainz-会话是用户在 Trainz 驾驶员 GUI 模块中操作的交互式脚本化活动——这是该软件系统提供的各种娱乐形式中最像游戏的一种”。
- TRS2004 用户可以使用内置的方法创建情景的初始结构,然后使用文本编辑器程序编写必要的代码。这种方法涉及使用 GameScript 编程,GameScript 是一种类似“C”的语言,具有许多扩展。
- TRS2004 和 TRS2006 用户都可以使用 SCS(情景创建系统)程序,该程序由第三方 Trainz 爱好者网站 Trainz Pro Routes 免费提供。TRS2004 和 TRS2006 有单独版本的 SCS。SCS 的目标是使情景创建过程尽可能简单,但即使这样,也需要付出相当大的努力。SCS 有完整的用户手册。
GameScript API(应用程序编程接口)文档可以在“Trainz Railroad Simulator 2004 用户活动创建指南”中找到,该文档可以从Auran的网站下载。熟悉本文件中列出的概念和各个函数至关重要。
以下是对这个本质上非常复杂的过程的高度简化的概述。为了尽可能地简化,它省略了许多细节。
在Surveyor中打开相关布局。
添加任何所需的轨标、触发器和其他路边物体。可以在轨标处创建火车。当火车进入触发器时将触发事件。不要保存对布局的更改。
在Surveyor菜单中,调用“导出场景数据”选项,并为新场景选择一个合适的名字。
关闭Surveyor。同样,不要保存对布局的更改。
一个新的文件夹将在C:\Program Files\Auran\TRS2004\World\Custom\scenarios文件夹中创建,名称与您在Surveyor中指定的名称相同。这个新创建的文件夹将包含构成场景基础的文件。
TSO(路边物体)文件包含对布局的修改细节,这些细节是特定于这个场景的,例如您在Surveyor中添加的额外的轨标和触发器。
使用文本编辑器打开场景的config.txt文件。kuid-table将已经包含布局。您需要添加场景使用的滚动库存资产,例如:(如何!!!)
kuid-table
{
testscenario <kuid:154110:5701376>
AN_830_Class <kuid:-1:100737>
QR_QLX <kuid:-1:101154>
}
如果您愿意,也可以美化描述文本。
使用文本编辑器打开gs(GameScript)文件。默认情况下,此文件包含大量的代码,几乎所有代码都应该保持不变。您需要在正确的位置添加额外的代码部分。
在“创建编组规格”部分,添加代码以指定火车最初放置在布局上的滚动库存。以下示例包含一列由AN830 Class机车牵引的QLX百叶窗货车。
KUID[] PlayerTrainKuids = new KUID[ 2 ];
PlayerTrainKuids[ 0 ] = World.FindKUID( "AN_830_Class" );
PlayerTrainKuids[ 1 ] = World.FindKUID("QR_QLX" );
在“创建编组”部分,添加代码以将火车放置在轨标处。以下示例将由“PlayerTrainKuids”编组规格组成的火车放置在名为TM01的轨标处。
Train PlayerTrain = World.CreateTrain( PlayerTrainKuids, "TM01", true );
在“游戏玩法”部分,在“scenarioDone = true;”行上方,添加代码以设置一些初始参数并执行场景的操作。以下是一个非常简单的示例,它仅仅允许用户驾驶PlayerTrain,而没有其他操作。
World.SetGameTimeRate( World.TIME_RATE_1X );
World.SetGameTime( 0.875 ); // 9am
World.SetWeather( World.WEATHER_TYPE_CLEAR, World.WEATHER_CHANGEABILITY_NONE );
World.SetCamera( PlayerTrain, World.CAMERA_EXTERNAL );
World.SetCameraAngle( 75, -15, 50 );
PlayerTrain.SetAutopilotMode( Train.CONTROL_MANUAL );
while( 1 == 1 )
{
Sleep( 0.1 );
}
在上面的示例中,“while”循环将永远等待,直到用户退出场景。一个真正的场景通常会正常完成并关闭,而无需用户干预。
不需要编译。一旦gs文件正确创建,就可以运行场景。在实践中,通常需要在编辑和测试循环中进行多次迭代。
- 一些关于 GameScript & TrainzScript 的评论,针对那些只熟悉传统 BASIC 或 Visual BASIC,而没有其他高级计算机语言的人。
提示:本节末尾有一些简单的示例。
以下内容适用于用于创建 TRS2004 场景的 GameScript。它在规则、命令、资产动作脚本程序、脚本化资产行为等方面的使用在某些重要方面与以下内容不同,但都共享相同的基础要求和基本语法。脚本化资产,例如路边信号、动画伐木机、联动道岔或信号,都必须与运行时软件进行交互,因此它们都在同一个“房子”里,这样说吧。 对于那些不熟悉除 BASIC 之外的任何形式的编程语言的人来说,学习 GameScript 可能会很困难。本节试图列出一些可能让初学者感到困惑的“陷阱”。 GameScript 没有专门的程序编辑器或 IDE(集成开发环境)。相反,使用文本编辑器程序,例如记事本或更高级的替代方案(Notepad++、Programmer's Notepad、ConTEXT、Crimson 在本文中被介绍)来编辑程序源文件,并且与IDE 中的“项目”不同,用户必须手动完成所有文件管理。在 GameScript 中,火车、信号、道岔等实体被认为是 具有属性的物体,这些属性可以由程序指定和访问。(计算机科学中属性的另一种说法是属性——“特征”的限定。)
提示:在 C 中,几乎所有重要的代码块,甚至过程或子程序(在 C 中都称为“函数”)都将用一对花括号括起来。如今,这些也可能被称为“包装器”——含义借鉴了与 HTML 标签对的相似之处。
|
|
与 Visual BASIC 一样,对于初学者来说,关于哪些方面由操作系统或编程语言处理,哪些方面必须由程序员处理,存在相当大的困惑。在 Trainz 中,用户列车和 AI 列车以异步方式执行列车运动,这使得情况更加复杂。
与 Visual BASIC 一样,除了相对简单的核心语言之外,还需要学习大量对象、它们的属性和函数。这些都在 Auran GameScript API 中有记录。 一项重要的实用说明:在 Auran GameScript API 文档中,一对匹配的相邻方括号可能显示得过于靠近,以至于看起来像是外框。 编者注: *'网络搜索'* 引用的短语:"The C Language" 和 "The C Programming Language" 用于在线语法和运算符来源。强烈建议任何尝试学习 C 或 C 派生语言(如 C/C++/C#、Java、Java script(实际上是大多数现代和最近的脚本语言))的人获取 Kernighan 和 Ritchie(该语言的发明者)的开创性著作 "The C Programming Language"。没有哪本书比这本更能让你更快地入门。 |
在 Trainz 中,对象在内部相互传递消息。这些内部消息用户是看不到的。GameScript 代码可以生成内部消息,还可以检测和接收内部消息。每个内部消息都有四个属性:源、目标、主要(即其主要消息类型)和次要(即其次要消息类型)。虽然初学者可以忽略这种消息传递的概念,但它经常出现在 Auran 文档中,因此值得在这里提及。
最后一条至关重要的建议:从一些真正非常简单的东西开始。让列车出现在轨道上本身对于刚开始学习 GameScript 的人来说就是一项非常了不起的成就。
示例 #1:IF 语句
//Equivalent to IF A=10 THEN...
if (a==10)
{
//dependent statements go here
}
示例 #2:FOR 循环
// Equivalent to FOR N=1 TO 5 STEP 1
for (n=1; n<=5; n=n+1)
{
//statements within the loop go here
}
示例 #3:WHILE 循环
while (a<50)
{
//statements within the loop go here
}
示例 #4:变量声明和初始化
int x=8;
示例 #5:声明数组
//Equivalent to DIM A(12) - possible subscript values will run from 0 to 12
float[] A = new float[ 13 ];
示例 #6:定义用户定义函数
int Cube(x)
{
//local variable declarations go here
//function statements go here
return (x*x*x);
}