该内容可以在浏览器中(PWA,离线,未注册账号)访问:https://dracoblue.github.io/vct/

这是一个立方体风格的RollerCoaster Tycoon。无限的沙盒,未设置场景,触摸优先。客人是独立的个体,有钱包,情绪和需求——他们排队,乘坐,感到恶心,吐在你的路径上,一个清洁工必须来擦拭。

两位代理人一起建造它,严格分离的包所有权;我负责建筑,审查和“这实际上感觉正确吗”的部分。

模拟很好。游乐设施的评分来自真实物理,客人是事件驱动的,而不是通过计时器保存的。所有这些都是可指定的——我可以写下什么是“正确”,然后我会得到正确的结果。

然后有轨道建造模式。第三次重写,我仍然不满意。这是有趣的部分,所以这是这篇文章。


轨道建造是一个与块建造不同的问题。放置一个块是一个“哪里”的问题。您选择3D空间中的一个单元格并确认。触摸时,这已经很尴尬了——您的手指盖住了您要瞄准的准确位置,但这只是一道问题。

轨道不是。每个部分继续从前一个部分的末端,所以位置已经确定。没有“哪里”。只有“下一个什么”:直线,左,右,上,下,升高山。然后是困难的第二部分——编辑一个已经存在的链条,从任何一端,中间有空缺。

我最初没有理解这一点,第一版的屏幕截图就表明了这一点。

截图1:六个轴按钮。 X+/X−,Y+/Y−,Z+/Z−,坐在屏幕的中间,盖住了您正在建造的准确区域。这回答了“哪里”。轨道模式不问“哪里”。所以UI正在解决一个模式不需要解决的问题,而遮住了您要看的东西。

它也违反了我的设计笔记。我写道:“解耦的光标——拖动一个幽灵块,高度在边缘滑动器上。”六个离散的轴按钮是“解耦”的字面读法,而是错误的。这是一个反复出现的模式:一句话的简报被实现了,但仍然错过了,因为简报描述了一个“感觉”,而构建的只是一个字面机制。


重写2:一个词汇表而不是坐标

截图2:方向盘. 左 · 直线 · 右在中间,高 · 低在右边,建造 · 价格在中间,前进 · 后退在左边,沿着链条移动。

这比前一个版本好不是因为它看起来更漂亮。它是因为按钮现在是“数据模型中的块类型词汇表”。一个轨道块是 typeId, direction, heightDelta, banking, flags。控制映射到这一一致性,所以玩家不需要在屏幕坐标系和轨道语义之间进行转换。

从这两个方面推出:

  • 控制器位于世界空间中的建造头部,而不是固定在屏幕位置。眼睛和拇指最终会在同一个位置,摄像机将建造头部框住,而不是整个公园。
  • 选择的方向滑动到中心,周围的块重新排列,建造的块总是在同一个拇指位置。

截图2 底部还有一个 shell,同一时间出现的:一个模式弹出窗口(查看 / 地形 / 建造 / 轨道)和一个下面的上下文条。轨道编辑器停止与商店放置和地形绘制争夺同一个屏幕空间。轨道模式保持锁定,直到存在一个站点,因为没有站点的轨道没有建造的起点。


重写3:这是一个状态机,并且它表明了这一点

建造一个新的电路是简单的一半。真正的工作是:

  • 在末端追加
  • 从开始建造一个布局——编辑器翻转方向
  • 浏览一个现有的电路,逐块移动,循环一旦它关闭
  • 填补一个中间的空缺——只有实际合法的块才能在中间插入
  • 删除——但只在一个空缺的边缘,或者一个独立的站点

截图3: 这是迭代中大部分时间花在这里的部分,我会称它为未完成的部分。每个状态都是合理的。一起,它是一个我设计的模式系统,我没有证据表明一个陌生人可以操作。直到现在我还没有看到别人建造一个完整的电路。我的预期是会很有成就感。


如果你要开始类似的东西

代理人在我有一个清晰定义的正确的地方是非常出色的。确定性回放,固定点经济,能量基于的列车物理,寻路,事件驱动的客人需求——所有这些都落地了,基本上正确,因为我可以指定它们,并且一个测试可以验证它们。

他们在我最弱的地方最弱:一个UI表面,其要求是“这应该像RCT在手机上一样感觉”。你不能用简报写这个。什么让它前进的是一个缓慢的循环——截图,我指出什么是错误的,一种假设“为什么”,重写。三次。

惊人的后果是:我的指令被实现了,仍然产生了错误的结果两次。解决方案是停止描述感觉,开始描述底层模型——“按钮应该是块类型词汇表”而不是“建造应该像流体一样感觉”。


还有很多开放的问题

  • 没有任何使用者测试(除了我和我的耐心孩子们 :)). 中间的空缺 / 后向建造 / 浏览状态是我的主要担忧。
  • 没有平面车。
  • JSON dump的浏览器内的数据库变得很大。
  • 没有真正的手机性能数字。计数器显示120fps,但这是在一个桌面上,40个客人,空白地形上,意味着什么也没有。这需要500个客人和一个密集的公园在一个弱手机上才算数。

我很乐意进入任何一个。有经验的开发者,如果你建造过一个触摸轨道编辑器,并且解决了中间空缺编辑的方法比这好,那么我很想听听。