Architecture 游戏/游戏引擎调试控制台如何工作?

Architecture 游戏/游戏引擎调试控制台如何工作?,architecture,game-engine,command-pattern,Architecture,Game Engine,Command Pattern,我之前在gamedev exchange上发布了这个问题,但它被标记为离题。我不知道如何编辑这个问题,使它更接近主题,所以我想也许在这里最好?问题已粘贴如下。我不是想引起讨论。如果您有任何建议,请告诉我如何改进此问题。 我正在使用OpenGL开发一个3D场景渲染器,调试控制台是我真正想要实现的东西,原因有两个: 我认为它会有助于开发,所以实现得越早越好。知道如何实现它似乎是一个非常有趣和强大的功能 我很难找到很多关于这些游戏机如何工作的好材料,我对此表示歉意,因为这很可能是由于糟糕的google

我之前在gamedev exchange上发布了这个问题,但它被标记为离题。我不知道如何编辑这个问题,使它更接近主题,所以我想也许在这里最好?问题已粘贴如下。我不是想引起讨论。如果您有任何建议,请告诉我如何改进此问题。

我正在使用OpenGL开发一个3D场景渲染器,调试控制台是我真正想要实现的东西,原因有两个:

我认为它会有助于开发,所以实现得越早越好。知道如何实现它似乎是一个非常有趣和强大的功能

我很难找到很多关于这些游戏机如何工作的好材料,我对此表示歉意,因为这很可能是由于糟糕的google fu。我确实发现这个问题似乎很相关,但是——我很可能错了——我不确定它是否在讨论我想要的东西。我希望创建一个非常强大的控制台,它可以使用参数执行命令,这样命令可能具有多个深度级别,例如,可能存在以下命令:

  • [摄像头设置位置]:将摄像头位置重置为0,0,0
  • [摄像头设置位置-3 2 5.5]:将摄像头位置设置为-3,2,5.5
  • [摄影机设置剪辑0.1 1000]:将摄影机近剪辑设置为0.1,远剪辑设置为1000
  • [摄影机设置远距剪辑1024]:将摄影机远距剪辑设置为1024
  • [新对象]:将新对象添加到场景中,但不确定用户应如何输入属性和组件属性,因为这些属性和组件属性的列表长度可变。例如,用户可能只是附加一个位置并将默认对象添加到场景中,或者他们可能甚至指定网格、纹理、着色器等
  • [新灯光3 2 1 0 255 0]:在3,2,1处向场景添加绿灯。显然,灯光还有一些其他属性
  • [新灯光3 2 1紫色]:在3,2,1处向场景添加紫色灯光
  • [object set texture fancy_image.png]:将场景对象列表中名为“objectname”的对象的纹理设置为“fancy_image.png”
抱歉,命令列表太长;我想彻底了解我感兴趣的命令类型,以及我希望这样一个控制台拥有的功能。我还不确定的是,这到底应该是一个引擎功能还是一个特定于游戏的功能?还是说这无关紧要?我曾在大学课程中简要学习过指挥模式,但它似乎相当僵硬,对于我所寻找的系统类型来说不够灵活。我完全误解了吗


这里的任何帮助都将受到感谢。

您基本上是在询问如何构建命令行界面,这或多或少与询问如何构建解析器相同

第一步应该是为您想要支持的每个命令构建一个类(或者函数,如果您在该范例中工作的话)。例如:

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;
}
您应该能够看到如何以更简洁的方式编写此文档


为解析器编写单元测试应该很简单

谢谢。是的。如果有人能帮我编辑或解释为什么它是离题的,我将不胜感激。有一个小的帮助中心部分与我的手机和我的黄油手指发布太早的rSorry有关!我想说的是,有一个小的相关帮助中心部分,但它没有提供太多的帮助给我。“如果您认为问题可以重新编写以符合范围,请考虑编辑该问题或留下评论以进行改进。”因此,我想更直接的问题可能是它如何超出范围?我明白了,谢谢。我认为,这个问题让我意识到,我正在与执行阶段作斗争,以及如何以一种干净利落的方式去做。拥有这个系统是否意味着我将不得不公开修改很多东西?我知道你说过你不会去实现,但是你有没有关于在哪里寻找更多关于编写这种功能的帮助的建议?非常有帮助,谢谢。你有几个选择。1) GameState类接受命令并决定如何处理它。2) 命令类获取游戏状态并对其进行修改;游戏状态必须公开此操作所需的所有属性。3) 你使游戏状态不可变,完全公开。命令类返回一个新的游戏状态,而不是修改它。这是一种功能性方法。我认为选项1听起来是一个好的开始。GameState类是常见的做法吗?在我的任何项目中,我从来没有上过游戏状态课程(我想)。它只是一个存储游戏系统实例和属性的类吗?GameState类是一种常见的做法。它将包含整个游戏状态,比如玩家位置、世界物体、分数等。好的,我觉得处理这个问题好多了。非常感谢。感谢你真的试图帮助我,因为我被任命为投票人,让我偏离主题:)