1

我正在开发一款游戏,根据项目中定义的一些约束或通过 mod 文件在外部定义的一些约束,将动态生成一堆角色。我正在使用 MoonSharp Lua (5.2) 解释器来连接我的 C# 代码,并使用 Lua 表来存储约束预设。举个例子:

require "Defaults"
AgePresets = {}

-- Single value
AgePresets.Newborn = 0

-- Simple ranges
AgePresets.Default = defaultAgeRange --referring to the Defaults require
AgePresets.Child = {1, 12} 
AgePresets.Teenager = {13, 19}
AgePresets.YoungAdult = {20, 29}
AgePresets.Adult = {30, 40}
AgePresets.MiddleAge = {40, 60} 
AgePresets.Senior = {61, 80}
AgePresets.Elder = {81, 99}
AgePresets.Methuselah = {100, 150}  
AgePresets.Methuselah2 = {150, 200}

-- Weighted ranges // again referring to previously defined elements to keep things concise
AgePresets.Tween = {
            {weight = 1, minmax = AgePresets.Teenager },
            {weight = 1, minmax = AgePresets.YoungAdult }
         } 

这很好用,但从最终用户的角度来看,这涉及到很多不必要的输入。我们显然正在研究 AgePresets,但它仍然作为每个成员名称之前的前缀被提及。

我当然可以将 AgePresets 定义为一个数组,例如 AgePresets = { Child = {}, Teenager = {} } 但这样做的问题是我无法引用数组中先前定义的元素。

这不起作用:

AgePresets = {
    Child = {1,12},
    RefToChild = Child, //attempt to index a nil value exception
    Teen = {13,19}
}

理想情况下,我想要实现的是一种干净、简洁的方式让用户输入这些数据,就像在第一个示例中一样,但不必放置 AgePresets。前缀在一切之前。如何在文件中声明一个范围,以使文件中定义的所有后续成员都在该范围内,同时保持引用之前在该范围内定义的其他成员的能力?

4

2 回答 2

1
AgePresets = setmetatable({}, {__index = _G})

do
   local _ENV = AgePresets
   Newborn = 0
   Child = {1,12}
   RefToChild = Child -- this ref is Ok
   Teen = {13,19}
   YoungAdult = {20,29}
   Tween = {
      {weight = 1, minmax = Teen },
      {weight = 1, minmax = YoungAdult }
   }
   rnd = math.random(10)   -- global functions are available here
end

setmetatable(AgePresets, nil)
于 2017-06-20T21:36:00.270 回答
0

可以混合使用两种样式:表构造函数用于不需要引用尚未在范围内的变量的字段,然后是其余的赋值语句。

我会这样做,除非代码中字段的顺序显着增强了理解力。

于 2017-06-22T22:33:04.843 回答