【问题标题】:How do game/game engine debug consoles work?游戏/游戏引擎调试控制台如何工作?
【发布时间】:2018-07-02 02:28:32
【问题描述】:

我之前在 gamedev exchange 上发布了这个问题,但它被标记为离题。我不确定如何编辑问题以使其更符合主题,所以我认为这可能是最好的?问题已按原样粘贴在下面。我不是想引发讨论。如果您有任何建议,请告诉我如何改进这个问题。

我正在使用 OpenGL 开发一个 3D 场景渲染器,并且出于以下几个原因,我真的很想实现一个调试控制台:

我认为它对开发有帮助,所以越早实施越好。知道如何实施似乎是一个非常有趣且强大的功能。

我很难找到很多关于此类控制台如何工作的好材料,我很抱歉,因为这很可能是由于糟糕的 google-fu 造成的。我确实发现这个问题似乎很相关,但是 - 我很可能是错的 - 我不确定它是否在讨论我正在寻找的东西。我正在寻找一个非常强大的控制台,它可以执行带有参数的命令,这样命令可能具有多个级别的深度,例如可能存在以下命令:

  • [相机设置位置]:将相机位置重置为 0,0,0。
  • [camera set pos -3 2 5.5]:将相机位置设置为 -3,2,5.5。
  • [摄像机设置剪辑 0.1 1000]:将摄像机近剪辑设置为 0.1,将远剪辑设置为 1000。
  • [camera set clip far 1024]:将camera far-clip设置为1024。
  • [新对象]:向场景中添加一个新对象,但不确定用户应如何输入属性和组件属性,因为这些列表的长度是可变的。例如,用户可能只是附加一个位置并将默认对象添加到场景中,或者他们可能会指定网格、纹理、着色器等。
  • [new light 3 2 1 0 255 0]:在场景 3,2,1 处添加绿灯。显然,灯光还有更多属性。
  • [new light 3 2 1 Purple]:在场景 3,2,1 处添加紫色灯光。
  • [object set texture fancy_image.png]:将场景对象列表中名为“objectname”的对象的纹理设置为“fancy_image.png”。

抱歉,命令列表很长;我想彻底了解我感兴趣的命令类型以及我希望这样的控制台拥有的功能。我不确定的其他一点是,这甚至应该是引擎功能还是特定于游戏的功能?或者这无关紧要?我在我的大学课程中简要研究了命令模式,但对于我正在寻找的系统类型来说,它似乎非常僵化且不够灵活。我是不是完全误解了?

感谢您在此提供任何帮助,并提前致谢。

【问题讨论】:

  • 谢谢。我做到了。如果有人可以帮助我编辑它或具体解释为什么它是题外话,我将不胜感激。有一个与 r 相关的小型帮助中心部分
  • 对不起,我在手机上,我的黄油手指发布得太早了!我要说的是有一个小的相关帮助中心部分,但它并没有为我提供太多帮助。 “如果您认为问题可以改写以适应范围,请考虑编辑问题或留下 cmets 进行改进。”所以我想一个更直接的问题可能是它是如何超出范围的?

标签: architecture game-engine command-pattern


【解决方案1】:

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

第一步应该是为您想要支持的每个命令构建一个类(或者可能是函数,如果您正在使用该范例)。例如:

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;
}

您应该能够看到如何以更简洁的方式编写它。

为解析器编写单元测试应该是微不足道的。

【讨论】:

  • 我明白了,谢谢。我认为最重要的是这个问题让我意识到我在执行阶段以及如何以一种干净而健壮的方式来解决这个问题。拥有这个系统是否意味着我将不得不公开修改很多东西?我知道您说过您不会参与实施,但是您有什么建议可以在哪里寻找更多关于编写此类功能的帮助?很有帮助,谢谢。
  • 您有几个选择。 1) GameState 类接受一个命令并决定如何处理它。 2) Command 类接受一个 GameState 并对其进行修改; GameState 必须公开为此所需的所有属性。 3) 你让 GameState 不可变并且完全公开。 Command 类返回一个new GameState,而不是修改它。这是函数式方法
  • 我认为选项 1 听起来是一个好的开始。 GameState 类是常见的做法吗?我的任何项目中都没有 GameState 类(我认为)。它只是一个存储游戏系统和属性实例的类吗?
  • GameState 类是一种常见的做法。它将包含游戏的整个状态,例如玩家位置、世界对象、分数等。
  • 好吧,解决这个问题我感觉好多了。非常感激。感谢您实际上试图帮助我,而不是投票给我的话题:)
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 2021-04-09
  • 1970-01-01
  • 2016-07-31
  • 2020-01-17
  • 1970-01-01
  • 2016-10-07
  • 2017-03-31
相关资源
最近更新 更多