c++ - 脚本如何通过在 Lua 中加载不同的脚本来保留其值?

标签 c++ c lua

我目前的问题是我有几个敌人共享相同的 A.I.脚本,以及另一个做不同事情的对象。脚本中的函数称为 AILogic。我希望这些敌人独立移动,但事实证明这是个问题。这是我尝试过的。

1) 在敌人的构造函数中调用dofile,然后在它的Update 函数中调用它的脚本函数,这发生在每个游戏循环中。问题在于 Lua 只使用了最后一个构建的敌人的脚本,所以所有的敌人都在 Update 函数中运行相同的脚本。因此,我上面描述的对象不使用相同的脚本,因为它是 A.I.正在使用其他敌人的脚本。

2) 在Update函数中调用dofile,紧接着调用它的script函数。问题是 dofile 在每个对象的更新函数中被调用,所以在 AILogic 函数运行并且该脚本的数据更新后,当为另一个敌人再次调用 dofile 时,整个事情就会被重置.我最大的问题是是否有某种方法可以保留脚本中的值,即使我切换到运行不同的脚本也是如此。

我读过 Lua 中的函数环境,但我不太确定如何正确地实现它们。这是正确的方向吗?感谢任何建议,谢谢。

编辑:我还考虑过创建一个单独的位置来存储该数据,而不是在 Lua 脚本中进行。

Edit2:添加了一些示例代码。 (只是一个让功能正常工作的测试)。

-- Slime's Script

local count = 0;

function AILogic( Slime )
  --Make the slime move in circles(err a square)
  if count < 4 then
    Slime:MoveDir( 0 );
  elseif count < 8 then
    Slime:MoveDir( 2 );
  elseif count < 12 then
    Slime:MoveDir( 1 );
  elseif count < 16 then
    Slime:MoveDir( 3 );
  else
    count = 0;
  end
  count = count + 1;
end

最佳答案

lua 解释器将每一行作为其自己的 block 运行,这意味着局部变量具有行范围,因此示例代码不能按原样运行。它要么需要一次全部运行(没有换行符),没有本地人,要么在 do ... 结束 block 中运行。

关于OP中的问题。如果您想共享完全相同的函数(即运行时的相同函数),则该函数需要将数据作为参数。但是,如果您可以使用相同的代码但使用不同的(运行时)函数,则可以使用闭包来保存本地/个人数据。

local function make_counter()
    local count = 0

    return function ()
        local c = count
        count = count + 1
        return c
    end
end

c1 = make_counter()
c2 = make_counter()
c3 = make_counter()

print(c1())
print(c1())
print(c1())
print(c1())
print(c2())
print(c3())
print(c2())
print(c3())
print(c2())
print(c3())

或者,您可以在每次调用函数时使用它的环境,但这只在某些情况下才能正常工作(取决于函数的内部结构)。

关于c++ - 脚本如何通过在 Lua 中加载不同的脚本来保留其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353431/

相关文章:

CMakeLists.txt 如何包含条件预处理器

objective-c - C 和 Objective C 之间的主要区别是什么。C 中可以进行抽象吗?

lua 用户数据 C++ 析构函数

c++ - 使用 glClearColor 初始化 QGLWidget

c++ - 数据结构-抽象数据类型(ADT)VS具体数据类型(CDT)

c - 重新排序二叉搜索树 'in place'

node.js - 从redis key nodejs弹出值的原子操作

lua - 跨架构luac输出

python - C++ 嵌入式解释器和对象

c++ - 有没有办法创建一个公共(public)输出流对象以在控制台上打印并打印到 C++ 中的文件?