好的,假设您设计了一个用c ++编写的游戏,并使用了lua以及该游戏的c ++部分与lua代码的确切交互方式。我最难理解的主要问题是:
是编译后转换为c ++对象的lua代码吗?
lua代码是否在c ++代码请求时编译?
lua代码是否依赖于c ++代码,就像使用c ++代码中的函数一样?
lua代码的内存是否与c ++代码中的内存集成在一起,还是一个完全不同的过程。
答案 0 :(得分:3)
对于4个问题的简单答案:(1)否(2)是(3)可能(4)综合。
虽然可能会有所帮助。
Lua是一个用C编写的解释器,它将嵌入到您的应用程序中。 Lua有一个lua_State结构,它管理整个脚本执行状态,包含所有全局变量,局部变量等.Lua传递这个结构。您可以编写操作此lua_State结构的C / C ++代码,允许您添加脚本可见的全局变量...您还可以查询lua_State结构以读取脚本设置的变量。除此之外,您还可以创建将执行Lua脚本函数的C / C ++代码,还可以编写C / C ++代码,将C函数导出到Lua脚本,可以直接从脚本调用。发生这种情况时,将lua_State对象传递给C函数,以便您可以使用读取它的脚本引擎数据并根据需要进行修改。
通常,用C / C ++编写的游戏将实现一个处理所有渲染和其他时间关键项目部分的引擎。有了引擎,你可以创建C / C ++代码来创建相关的对象来创建和控制你的游戏。但是,您也可以将引擎API导出到Lua,然后创建Lua脚本来调用引擎API,以便在脚本中控制游戏。
大部分时间都不需要这样做。您希望游戏引擎保持对其执行方式的控制,但您希望允许引擎在特定指南中以某种方式进行扩展。为此,大多数引擎将使用一种“回调”机制添加Lua支持,其中游戏引擎旨在在某些时间点发出对某些Lua脚本函数的调用。例如。可能存在两个对象之间某种类型的冲突的回调,以允许用户决定做什么。然后Lua脚本可以根据需要更改对象状态,例如根据需要生成爆炸效果的新对象。
某些引擎会为每个调用创建和销毁新的Lua实例(新的lua_State对象),这意味着您无法创建全局Lua变量并在调用之间保留它们,其他引擎将使用相同的实例,因此您可以创建自己的全局Lua变量和和他们一起做你想做的事。这取决于引擎编写者。
为游戏添加脚本意味着您只需要考虑您希望用户如何扩展引擎,并创建API以允许他们执行此操作,然后决定如何实现此目标。
答案 1 :(得分:0)
是编译后转换为c ++对象的lua代码吗?
不,它会被转换为解释器随后执行的指令。
lua代码是否在c ++代码请求时编译?
是
lua代码是否依赖于c ++代码,就像使用c ++代码中的函数一样?
它可以但不是必须的。您可以决定从Lua提供哪些c / c ++变量和函数。
lua代码的内存是否与c ++代码中的内存集成在一起,还是一个完全不同的过程。
集成,同样的过程。