【问题标题】:C++ multiple Lua statesC++ 多个 Lua 状态
【发布时间】:2019-06-29 17:08:08
【问题描述】:

我想为多个游戏对象使用同一个 lua 文件

lua 文件:

function onUpdate()
    if Input.isKeyDown(Keys.d) then
        actor.x = actor.x + 0.1
    end

    if Input.isKeyDown(Keys.a) then
        actor.x = actor.x - 0.1
    end

    if Input.isKeyDown(Keys.w) then
        actor.y = actor.y + 0.1
    end

    if Input.isKeyDown(Keys.s) then
        actor.y = actor.y - 0.1
    end
end

问题

为每个对象设置一个 Lua 状态是一种好习惯,还是我应该为同一个文件使用相同的状态并在游戏对象调用脚本之前更新“actor”全局变量 (我想避免使用表,因为我必须在变量和函数调用之前使用表名) (不知道有没有其他解决方法……我是lua新手)

【问题讨论】:

  • 你不必为同一个文件使用相同的状态,但是每个对象有一个 Lua 状态是浪费的。 actor 不必是全局变量。例如,它可能是onUpdate() 的参数。但是你最好先学习 Lua,有很多方法可以实现对象并处理它们。

标签: c++ lua game-engine


【解决方案1】:

虽然在一个程序中可以有多个 Lua 状态是很好的,但请记住,每个状态都占用一些内存。如果您有充分的理由让两个环境完全分开,例如安全问题,或者可能同时需要也可能不需要的完全不相关的子系统,那么这当然是值得的。

否则,拥有单个 Lua 状态通常会更好并且更易于管理。


如果您需要不同逻辑块之间的强分离,Lua 可以满足您的需求:

协程

如果您需要多个逻辑块并希望稍后暂停和恢复,您可以简单地将它们包装在协程中。这也可以在 C 语言中轻松完成,并且允许您执行大多数可以使用不同 Lua 状态执行的操作。

环境

虽然这些在 Lua 5.2 之前和之后的工作方式有所不同,但基本思想是相同的:您可以更改对代码的一部分可见的“全局”变量,甚至使用元表来访问其他数据或在飞。


有了这两个,你应该真的不需要在游戏中单独的 Lua 状态了。这条规则的一个例外显然是多线程。除非您使用某种锁定机制,否则您不应该有多个线程可以访问相同的 Lua 状态,因此每个线程有一个状态并为它们设置一种从 C 中进行通信的方式是有意义的。

【讨论】:

  • 我不知道环境。它帮助了我,谢谢!
猜你喜欢
  • 2012-11-24
  • 2011-01-30
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多