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,但我必须为每个元素设置一个数组,有没有更简单的方法?

点赞
用户6803631
用户6803631

只需要使用表格:

player = {}
player.x = 100
print(player.x)  -- 输出100

注意,player.x 仅仅是 player["x"] 的语法糖,所以下面的两行代码是等价的:

print(player.x)     -- 输出100
print(player["x"])  -- 也输出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)           -- 输出20
print(player["inventory"][2]["stat"]["damage"])  -- 等价,也输出20

最好的做法可能是定义函数,创建物品或玩家,并自动设置所有必需的字段。

最终,你可能想使用真正的 类和对象(例如,如果你想在对象上定义方法)。

编辑:

以下是上面的示例,包括函数 create_itemcreate_player,用于创建物品或玩家。我使用了[命名参数](https://www.lua.org/pil/5.3.html)用于这些函数,这样就不必记住函数参数的顺序(注意使用括号调用函数时的花括号)。

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)           -- 输出20
print(player["inventory"][2]["stat"]["damage"])  -- 等价,也输出20
2016-11-04 04:17:46
用户1836540
用户1836540

你总是可以缩短你的代码:

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)
2016-11-12 02:23:05