能否不创建个别函数而制作可折叠的变量?
2016-2-12 22:31:19
收藏:0
阅读:47
评论:1
我有一段代码,起始时只有少量变量,使用这些起始变量制作更多元素。
function new( x, y, width, height )
local object = {}
--border
object.border = { x = x, y = y, width = width, height = height }
--body
object.body = { x = x+1, y = y+1, width = width-2, height = height-2 }
--font
object.font = {}
object.font.size = (object.body.height+2)-(math.floor((object.body.height+2)/4)+1)
object.font.height = love.graphics.setNewFont( object.font.size ):getHeight()
--padding
object.padding = {}
object.padding.height = math.floor(object.border.height*(2/29))
object.padding.width = object.padding.height*3
--text
object.text = { input = '' }
object.text.centerHeight = math.ceil(object.body.y+((object.body.height-object.font.height)/2))
object.text.left = object.body.x+object.padding.width+object.padding.height
--backspacing
object.backspace = {key = false, rate = 3, time = 0, pausetime = 20, pause = true}
--config
object.config = { active = true, devmode = false, debug = false, id = gui.id(), type = 'textbox' }
gui.add(object)
return object.config.id
end
我在中间部分修改一些内容时,整个代码就乱了,因为从我修改的那个变量开始直到底部的值都不相同。
local x = gui.get(2)
x.body.height = 50
我想知道是否有一种方式,可以重新定义这些变量,从它们开始一直到底部,而不需要:(a)为每个变量创建函数;(b)编辑函数中所需的参数。
如果没有,有没有其他有效的方法来实现这个目的?
编辑: 变量的结构如下:
border->body->padding->font
我需要一种方法,可以定义任何一个变量,以便接下来的变量也会改变,例如:
object.body.x = 15
这样它会从重新定义的变量开始折叠到底部:
body->padding->font
但这意味着我必须在编辑某个变量到底部时重复此过程,例如这样做是极其低效的,尤其是当我添加更多元素时。
例如:
--padding->font
object.padding.width = 5
object.font.size = object.padding.width+1
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以使用元表,具体来说是 __newindex 字段:
(嗯,需要与 __index 字段相结合,但是呃)
function new(x, y, width, height ) local object = { font = {}, padding = {}, text = {input=''}, -- 表本身是静态的 -- 同样,我假设 text.input 会更改并且必须保持不变 } -- 这里有更多静态数据(是的是的,我知道。代码有点丑,但是如果它能很好地运行...) object.config = { active = true, devmode = false, debug = false, id = gui.id(), type = 'textbox' } object.backspace = {key = false, rate = 3, time = 0, pausetime = 20, pause = true} object.border = { x = x, y = y, width = width, height = height } -- 从上面的变量计算必须进行的事情放在下面 local border = object.border local function calculate() --border --body object.body = { x = border.x+1, y = border.y+1, width = border.width-2, height = border.height-2 } --font object.font.size = height-(math.floor(height/4)+1) object.font.height = love.graphics.setNewFont( object.font.size ):getHeight() --padding object.padding.height = math.floor(object.border.height*(2/29)) object.padding.width = object.padding.height*3 --text object.text.centerHeight = math.ceil(object.body.y+((object.body.height-object.font.height)/2)) object.text.left = object.body.x+object.padding.width+object.padding.height --backspacing --config end calculate() local proxy = setmetatable({},{ __index = object; -- proxy.abc 返回 object.abc(要获取宽度,请使用 proxy.border.width) __newindex = function(s,k,v) -- 在执行“proxy[k] = v”时触发 -- 我假设您只会更改 x / y / width / height,因为其他属性是动态的。 -- 执行“proxy.x = 123”与“object.border.x = 123” + 重新计算是相同的 object.border[k] = v -- 实际应用更改 calculate() -- 重新计算基于上述更改的其他属性 end; }) gui.add(object) return object.config.id end您可以运行如
proxy.x = 12的代码来编辑 X 属性。所有值都将被重新计算。这并不是最好的方法,但您的代码有点麻烦,需要改进。_(但是,如果这可以正常工作,那就好)_注意:您只能设置 x_、_y_、_width 和 height_。但是您仍然可以通过旧的方式获取所有属性,例如 proxy.padding.width_。 **(请注意,proxy.x 不起作用。请使用 proxy.border.x)**