我在gamedev交换之前发布了这个问题,但它被标记为偏离主题。我不确定如何编辑问题以使其更多关于主题,所以我可能在这里最好吗?问题已粘贴在下面。我不是想引发讨论。如果您有任何建议,请告诉我如何改进此问题。
我正在使用OpenGL开发一个3D场景渲染器,并且出于以下几个原因我想实现调试控制台:
我认为它有助于开发,所以越早实现越好。知道如何实现它似乎是一个非常有趣和强大的功能。
我很难找到关于这些游戏机如何工作的很多好材料而且我道歉,因为这很可能归结为糟糕的google-fu。我确实发现这个问题似乎非常相关但是 - 我很可能是错的 - 我不确定它是在讨论我正在寻找的东西。我正在寻找一个非常强大的控制台,因为它可以执行带参数的命令,这样命令可能有多个深度级别,例如可能存在以下命令:
对于很长的命令列表感到抱歉;我想彻底了解我感兴趣的命令类型以及我希望这样的控制台具有的强大功能。我不确定的其他事情是,这甚至应该是引擎功能还是特定于游戏的功能?或者那是无关紧要的?我已经在我的大学课程上简要地研究了命令模式,但它看起来很僵硬,而且对于我正在寻找的系统类型来说还不够灵活。我是否完全被误解了?
我们非常感谢您的帮助,并提前致谢。
答案 0 :(得分:2)
您基本上是在询问如何构建命令行界面,这或多或少与询问如何构建解析器相同。
第一步应该是为你想要支持的每个命令构建一个类(或者可能是函数,如果你正在使用该范例)。例如:
public class SetCameraPositionCommand extends Command {
float x;
float y;
float z;
// etc...
}
然后,您需要设计一个将命令应用于游戏状态的函数。我不打算在这里进行实施,但签名可能是这样的:
void applyCommand(GameState gameState, Command command);
一旦你有了工作,现在是时候编写你的解析器了。有很多方法可以做到这一点,但我建议用手写的东西开始,非常基本。
例如:
Command parseCommand(string input) {
const args = input.split(' ')
.map(x => x.trim().toLowerCase())
.filter(x => x.length > 0);
if (args.length == 2 && args[0] == 'camera' && args[1] == 'reset') {
return new ResetCameraCommand();
}
// etc...
return null;
}
你应该能够看到如何以更清洁的方式写出来。
为解析器编写单元测试应该是微不足道的。