game/game 引擎调试控制台如何工作?
How do game/game engine debug consoles work?
我之前在 gamedev exchange 上发布了这个问题,但它被标记为偏离主题。我不确定如何编辑问题以使其更贴近主题,所以我想也许在这里最好?该问题已按原样粘贴在下面。我不是想引发讨论。如果您有任何建议,请告诉我如何改进这个问题。
我正在使用 OpenGL 开发 3D 场景渲染器,调试控制台是我真正想要实现的东西,原因如下:
我认为它会对开发有所帮助,所以它越早实现,better.It 似乎是一个非常有趣且强大的功能,需要了解如何实现。
我很难找到关于这些控制台如何工作的好东西 material ,我很抱歉,因为这很可能归结为糟糕的 google-fu。我确实发现这个问题似乎很相关,但是 - 我很可能是错的 - 我不确定它是否在讨论我正在寻找的东西。我希望创建一个非常强大的控制台,因为它可以执行带有参数的命令,这样命令可能具有多个深度级别,例如可能存在以下命令:
- [相机设置位置]:将相机位置重置为 0,0,0。
- [相机设置位置 -3 2 5.5]:将相机位置设置为 -3,2,5.5。
- [相机设置剪辑 0.1 1000]:将相机近剪辑设置为 0.1,将远剪辑设置为 1000。
- [camera set clip far 1024]:将相机 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"。
抱歉命令列表太长;我想全面了解我感兴趣的命令类型以及我希望这样的控制台具有的功能类型。我不确定的另一件事是这是否应该是引擎功能或特定于游戏的功能?或者这无关紧要?我在我的大学课程中简要研究了命令模式,但它似乎非常僵化并且对于我正在寻找的系统类型来说不够灵活。我是不是完全误解了?
在此感谢任何帮助,并提前致谢。
您基本上是在询问如何构建命令行界面,这或多或少与询问如何构建解析器相同。
第一步应该是为每个要支持的命令构建一个 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;
}
您应该能够看到如何以更简洁的方式编写它。
为解析器编写单元测试应该是微不足道的。
我之前在 gamedev exchange 上发布了这个问题,但它被标记为偏离主题。我不确定如何编辑问题以使其更贴近主题,所以我想也许在这里最好?该问题已按原样粘贴在下面。我不是想引发讨论。如果您有任何建议,请告诉我如何改进这个问题。
我正在使用 OpenGL 开发 3D 场景渲染器,调试控制台是我真正想要实现的东西,原因如下:
我认为它会对开发有所帮助,所以它越早实现,better.It 似乎是一个非常有趣且强大的功能,需要了解如何实现。
我很难找到关于这些控制台如何工作的好东西 material ,我很抱歉,因为这很可能归结为糟糕的 google-fu。我确实发现这个问题似乎很相关,但是 - 我很可能是错的 - 我不确定它是否在讨论我正在寻找的东西。我希望创建一个非常强大的控制台,因为它可以执行带有参数的命令,这样命令可能具有多个深度级别,例如可能存在以下命令:
- [相机设置位置]:将相机位置重置为 0,0,0。
- [相机设置位置 -3 2 5.5]:将相机位置设置为 -3,2,5.5。
- [相机设置剪辑 0.1 1000]:将相机近剪辑设置为 0.1,将远剪辑设置为 1000。
- [camera set clip far 1024]:将相机 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"。
抱歉命令列表太长;我想全面了解我感兴趣的命令类型以及我希望这样的控制台具有的功能类型。我不确定的另一件事是这是否应该是引擎功能或特定于游戏的功能?或者这无关紧要?我在我的大学课程中简要研究了命令模式,但它似乎非常僵化并且对于我正在寻找的系统类型来说不够灵活。我是不是完全误解了?
在此感谢任何帮助,并提前致谢。
您基本上是在询问如何构建命令行界面,这或多或少与询问如何构建解析器相同。
第一步应该是为每个要支持的命令构建一个 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;
}
您应该能够看到如何以更简洁的方式编写它。
为解析器编写单元测试应该是微不足道的。