Lua,这可能吗?

时间:2016-11-04 03:52:02

标签: lua

我正在使用love2d进行游戏,而且我还没有完全按照lua编程。我不确定技术措辞,所以我会发布我的代码并解释我想要做的事情:

item = {}
item.stat = {}
player.x = 100
player.y = 100
-- 
item[0].stat.damage = 10

我想做的是制作库存系统和商品数据库。我希望能够使用上面的代码创建项目数据库,这样我就可以添加如下项目:

item[1].stat.damage = 10
item[1].stat.speed = 10
item[2].stat.damage = 20
item[2].stat.speed = 5
--
player.inventory[0] = item[1]
player.inventory[1] = item[2]

有人可以告诉我这可能是什么编码原则,所以我可以研究它?我基本上想要制作一个我可以像上面一样访问的矩阵,同时具有命名数组的便利,而不是说item[1,"damage"] = 10

编辑:

我意识到现在我可以做item.stat.damage [1] = 10但我必须为每个设置一个数组,有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

只需使用表格:

player = {}
player.x = 100
print(player.x)  -- prints 100

请注意,player.x只是player["x"]的语法糖,因此以下几行是等效的:

print(player.x)     -- prints 100
print(player["x"])  -- also prints 100

考虑到这一点,你可以构建你的游戏数据,例如:

item = {}
item[1] = {}
item[1].stat = {}
item[1].stat.damage = 10
item[1].stat.speed = 10
item[2] = {}
item[2].stat = {}
item[2].stat.damage = 20
item[2].stat.speed = 5

player = {}
player.x = 100
player.y = 100
player.inventory = {}
player.inventory[1] = item[1]
player.inventory[2] = item[2]

print(player.inventory[2].stat.damage)           -- prints 20
print(player["inventory"][2]["stat"]["damage"])  -- equivalent, also prints 20

定义创建项目或玩家的功能并自动设置所有必需的字段可能是个好主意。

最后,您可能希望使用实际的classes and objects(例如,如果要在对象上定义方法)。

修改

以上是使用函数create_itemcreate_player创建项目或玩家的示例。我已经将named parameters用于这些函数,因此不必记住函数参数的顺序(注意调用函数时的花括号)。

function create_item(arg)
    local item = {}
    item.stat = {}
    item.stat.damage = arg.damage
    item.stat.speed = arg.speed
    return item
end

function create_player(arg)
    local player = {}
    player.x = arg.x
    player.y = arg.y
    player.inventory = {}
    return player
end

item = {}
item[1] = create_item{damage=10, speed=10}
item[2] = create_item{damage=20, speed=5}

player = create_player{x=100, y=100}
player.inventory[1] = item[1]
player.inventory[2] = item[2]

print(player.inventory[2].stat.damage)           -- prints 20
print(player["inventory"][2]["stat"]["damage"])  -- equivalent, also prints 20

答案 1 :(得分:0)

您可以随时缩短代码:

item = {
    stat = {},
    [0] = { stat = { damage = 10 } },
    [1] = { stat = { damage = 10, speed = 10 } },
    [2] = { stat = { damage = 20, speed = 5 } },
}
player = { x = 100, y = 100, inventory = { [0] = item[1], [1] = item[2] } }

您可以使用矩阵方式访问该代码,例如

function item:getstat(index, param)
    return self[index] and self[index].stat and self[index].stat[param];
end

function item:setstat(index, param, value)
    local t1 = self[index]
    if (t1 == nil) then
        t1 = {}
        self[index] = t1
    end
    local t2 = t1.stat
    if (t2 == nil) then
        t2 = {}
        t1.stat = t2
    end
    t2[param] = value
end


print(item:getstat(0, "damage"))
item:setstat(1, "speed", 20)