1

我已经编写了一些基本的 2D 射击游戏,就它们而言,它们运行良好。为了建立我的编程知识,我决定使用一种简单的脚本语言来扩展我的游戏来控制一些对象。其目的更多是关于编写脚本解析器/执行器的一般设计过程,而不是对随机对象的实际控制。

所以,我目前的思路是使用一个 lambda 表达式容器(可能是一个映射)。当解析器读取每一行时,它将确定表达式的类型。然后,一旦它决定了指令的类型并发现了它必须使用的任何值,它就会打开映射到该表达式的类型,并将它需要工作的任何值传递给它。

一个或多或少的伪代码示例如下所示:

//We have determined somehow or another that this is an assignment operator
someContainerOfFunctions["assignment"](whatever_variable_we_want);

那么,你们觉得这样的设计怎么样?

4

3 回答 3

2

不要气馁,但我认为你会从将 Squirrel 或 Lua 之类的东西嵌入到你的项目中并学习使用 API 和语言本身中获得更多收益。这样做的好处是您将获得良好的性能,而无需考虑实施。

从头开始实现脚本语言(甚至是基本的)是一项艰巨的任务,尤其是当您以前没有做过的时候。

于 2009-09-30T02:01:19.233 回答
2

老实说:我认为这不是你描述的一个好主意,但确实有潜力。

这限制了 C++ 的静态参数数量的“烦人”负担,这可能是也可能不是您想要的语言。

想象一下——你想表示一个函数:

VM::allFunctions["functionName"](variable1);

但是该函数需要两个参数!我们如何定义一个动态参数函数?带“ ...” - 这意味着stdargs.hva_list。不幸的是, va_list 有缺点 - 你必须提供一个额外的变量,它会以某种方式向你提供关于有多少变量的信息,所以我们将我们虚构的函数调用更改为:

VM::allFunctions["functionName"](1, variable1);
VM::allFunctions["functionWithtwoArgs"](2, variable1, variable2);

这给您带来了一个新问题 - 在运行时,无法传递多个参数!所以我们必须将这些参数组合成可以在运行时定义和使用的东西,让我们(假设地)将它定义为

typedef std::vector<Variable* > VariableList;

我们现在的电话是:

VM::allFunctions["functionName"](varList);
VM::allFunctions["functionWithtwoArgs"](varList);

现在我们进入“作用域”——没有作用域就不能“执行”一个函数——尤其是在嵌入式脚本语言中,你可以拥有多个虚拟机(沙盒等),所以我们必须有一个Scope类型,这将假设的调用更改为:

currentVM->allFunctions["functionName_twoArgs"].call(varList, currentVM->currentScope);

我可以继续说下去,但我想你明白我的回答的重点——C++ 不喜欢动态语言,它很可能不会改变以适应它,因为它很可能也会改变 ABI。

希望这将带您走向正确的方向。

于 2009-09-30T02:34:49.580 回答
0

您可能会发现 Greg Rosenblatt 在 GameDev.net 上关于用 C++ 创建脚本引擎的系列文章 ( http://www.gamedev.net/reference/articles/article1633.asp ) 很有价值。

他采用的方法似乎偏向极简主义,因此可能是一种非常合适的方法,也可能是实现想法的良好来源。

于 2009-09-30T02:10:48.490 回答