Lua,这是可能的吗?
2016-11-4 4:10:23
收藏:0
阅读:79
评论:2
我正在使用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,但我必须为每个元素设置一个数组,有没有更简单的方法?
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

只需要使用表格:
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_item和create_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