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

标签 architecture game-engine command-pattern

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

我正在使用 OpenGL 开发 3D 场景渲染器,并且我非常想实现一个调试控制台,原因如下:

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

我很难找到很多关于此类控制台如何工作的好 Material ,我很抱歉,因为这很可能归咎于可怜的谷歌。我确实发现这个问题似乎非常相关,但是 - 我很可能是错的 - 我不确定它正在讨论我正在寻找的东西。我希望创建一个非常强大的控制台,因为它可以执行带有参数的命令,这样命令可能具有多个深度级别,例如可能存在以下命令:

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

抱歉命令列表太长;我想彻底了解我感兴趣的命令类型以及我希望这样的控制台具有什么样的功能。我不确定的另一件事是这是否应该是引擎功能或游戏特定功能?或者说这无关紧要?我在大学类(class)中简要研究了命令模式,但对于我正在寻找的系统类型来说,它似乎相当僵化且不够灵活。我是否完全误解了?

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

最佳答案

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

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

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

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

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

关于architecture - 游戏/游戏引擎调试控制台如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398844/

相关文章:

c# - 这是使用命令模式的正确方法吗?

java - Android 数独游戏中的撤消、重做

java - "Lambda expressions are not supported in -source 7, use -source 8 to enable lambda expressions"

c# - 使用 Autofac 解析通用接口(interface)

design-patterns - 规范模式、Func<T,bool> 谓词与管道和过滤器的比较

ios - NSTimer 与 CACurrentMediaTime()

ios - 如何在顺序命令之间传递数据?

azure - 如何在使用CQRS方法构建的系统中运行周期性任务?

java - 辩论 - 从数据库层还是Java层调用Web服务?

python - 将 SQLAlchemy ORM 分离实体公开为域对象