大约8年前,我有一个创造一款游戏的想法,其中玩家可以编程空间飞行器、控制它们的系统、管理飞行等。这个游戏的概念类似于Kerbal Space Program,但玩家不是建造飞行器,而是编程它们。我也不是喜欢KSP中的那样,你基本上要手动飞行飞行器—— lining up rendezvous points 和 docking “by eye”。我想要更多的自动化(空间站应该自己生长)。这时,我粗糙、遥远的游戏形象开始变得清晰。当然,像往常一样,最后的版本变得与我最初的想法完全不同——很多特性变得难以实现,某些特性看起来在我的想象中更好,但实际上却不如预期。然而,我认为我抓住了核心想法,并且我对结果很满意。 概述: 玩家被赋予了写并测试代码的能力,在一个特殊的测试环境中,可以重置并重复运行任意次数(重置飞行器的位置和速度回到初始值)。 https://preview.redd.it/ehwxz9bv5zgh1.png?width=2558&format=png&auto=webp&s=e8bdf4c0053e76517416f5510168cbdbffa71e70 显示飞行器轨道和名称的地图视图模式: https://preview.redd.it/53do60z06zgh1.png?width=2554&format=png&auto=webp&s=f9d8aadf54989ced4a1e4caf106710a29592fd3a 飞行器系统: 每个飞行器都有一个系统的集合,形成一个地址树,玩家可以通过提供的方法与之交互。这可以被认为是与飞行器“硬件”的抽象层。玩家可以在其上构建自己的抽象层,包装这些命令以自己的功能。以下是某些可用的方法,以便更好地了解这一点: System.Navigation / position() velocity() angle() angularVelocity() ... / System.PowerSupplySystem / status() energyProduction() energyConsumption() energyAccumulated() ... / System.RCS / (反应控制系统) [block1-2] (左/右) activateUnitAFor(duration) activateUnitBFor(duration) activateUnitCFor(duration) / System.RadioCommunication / status() enable() / disable() sendMessage() / ... 系统监控: 玩家获得了监控所有关键飞行器系统的便利工具,因此无需手动请求数据或在输出控制台中浏览。 https://preview.redd.it/hiw6g8k26zgh1.png?width=1709&format=png&auto=webp&s=3d0a7a896c00a5e801b0cdd67aeef72c677f512b 单个监视器模板用于相同类型的飞行器。监视器可以有多个页面(理想情况下,每个系统一个页面)——到目前为止,我只为雷达创建了一个单独的页面(关于此稍后会有更多信息)。在将来,我打算让玩家创建自定义监视器,使用他们想要的任何参数,甚至与特定命令相关的按钮。以下是与空间站对接的飞行器的示例。该软件具有预定义的路线,让龙飞行器按照该路线飞行。坐标系被固定在飞行器需要对接的空间站的对接口上。由于所有操作都非常缓慢,视频将会加速。 https://reddit.com/link/1vdlkk5/video/mb6p81n46zgh1/player 每次迭代中,对接算法都会查询 LaserRangeFinder 系统的数据,该系统提供了所有附近飞行器和其对接口的当前位置。数据请求的格式如下: const data = System.RPO.LaserRangeFinder.scan(); 方法返回一个JSON结构,指定了所有附近飞行器对接口的距离。这样,龙飞行器就可以持续监测其周围的环境,并知道任何附近飞行器的距离。 LRF(激光范围测量器)——用于精确测量飞行器的大小和距离。它提供了所有在150米范围内的飞行器的信息。对接口用黄色点标记。 PR(近距离雷达)——用于长距离目标检测(1-50公里)。 https://preview.redd.it/6ikm8ed5fzgh1.png?width=1336&format=png&auto=webp&s=46e1dd261f9cb3a226d97b75e08237391a1d98cc 另一个有趣的例子是机器臂,它可以移动模块并改变空间站的配置。这台机器臂由一个单独的系统控制, System.Canadarm。玩家可以控制每个关节,设置其旋转方向——顺时针或逆时针。没有逃避逆向运动学 :) 同时,和谐模块使用其RCS推进器来保持整个空间站平衡,因为移动模块会产生需要补偿的扭矩。 https://reddit.com/link/1vdlkk5/video/e3xl8p2c6zgh1/player 数据链路: 这是地面无线电站——一个工具,让玩家可以向飞行器发送无线电命令(一个卫星,例如),接收回复,并一般地在任何频率上监听。玩家也可以编程这个无线电站,例如定期与飞行器联系,发送有用的数据,并接收回复,例如遥测。还有一个选项是通过上行窗口手动发送命令,但这些命令需要在代码中预定义。从飞行器接收的信号也可以在代码中访问,并在下行窗口中以十六进制和ASCII格式进行反映。 在这个场景中,我正在调用一个命令,发送一个信号(一系列Uint8字节)。我传递了卫星的id——10——作为参数。这个参数作为一个单独的字节发送到无线电信号中,以便卫星知道该消息是为其而发送的: System.RadioCommunication.Transmitter.sendMessage(msg); 卫星接收信号,解析字节,并确定被要求做什么——在本例中,请求其内置系统的温度: const data = await System.TCS.info(); // TCS:温度控制系统 方法返回一个对象,这个对象用于构建一个遵循特定格式的回复,并将该回复发送回地面无线电站(groundComSystem)。 #onNewSignalReceived(msg) { // 处理接收到的信号 } 无线电信号旁边出现的图标表示卫星正在发送或接收无线电信号。 https://reddit.com/link/1vdlkk5/video/ws8p7lkg6zgh1/player 无线电通信也可以在两个飞行器之间进行。传输器接收器可以调谐到不同的频率,使得同时与多个飞行器在不同的通道上进行通信成为可能。 命令控制台: 如果飞行器有人员crewed,玩家可以通过命令行控制它,就像一个在飞行器上的人员直接输入命令一样。命令行中的可用命令必须在飞行器的软件中预定义,这意味着玩家可以为其特定的需求、情况和场景创建自己的命令。 在这个场景中,照明是通过命令行控制的: (我不是一个很好的艺术家,所以我无法为模块创建现实主义或美观的照明。) https://reddit.com/link/1vdlkk5/video/mc92xl2n6zgh1/player 我希望我能够将这个项目的核心想法传达给你。这个版本只是为了展示整个概念而存在——它基本上是一种沙盒,没有任务、关卡、目标或类似的事情。 我非常感兴趣地想知道这是否是人们实际上会感兴趣“玩”的东西,所以我很希望在评论中听到你的想法和反馈。 我也很想知道你想要在这种游戏中看到什么样的内容——近期/当前技术,还是更远的技术,例如激光、防护罩和无人机——以及任何关于故事或背景的想法。 除了传统的文本编程之外,可能值得在这种程序中添加块级编程,类似于Scratch。这类程序对于教授 aerospace工程基础知识的大学和学院可能会非常有用。 感谢所有读到这篇文章的人——我很乐意回复任何评论! (伴有声音) https://reddit.com/link/1vdlkk5/video/cnff7zb69zgh1/player