代表们 – 在Lua呼叫代表团
发布时间:2020-12-14 21:44:12 所属栏目:大数据 来源:网络整理
导读:我正在使用Lua上的游戏框架.现在,如果我想创建一个按钮,我可以通过为我的按钮创建一个表来保存函数和两个精灵(按钮向下和向上). 精灵有很多基本功能,如setLocation(self,x,y)或getDimensions(self). 我不想创建这样的很多函数: function button.setLocation
我正在使用Lua上的游戏框架.现在,如果我想创建一个按钮,我可以通过为我的按钮创建一个表来保存函数和两个精灵(按钮向下和向上).
精灵有很多基本功能,如setLocation(self,x,y)或getDimensions(self). 我不想创建这样的很多函数: function button.setLocation(self,y) self.buttonUpSprite(self,y) end 但是我想“自动”将对按钮的大多数调用直接委托给buttonUp精灵. 只需将按钮表的metatable __index设置为指向精灵就会转发调用sprite的函数,但是self引用会指向按钮仍然不是我想要操作的sprite. 这个代表团有干净的方式吗? 解决方法
您可以使用嵌套的metatable按需自动构建重定向功能:
---------------------------------- -- sprite.lua ---------------------------------- local Sprite = {} local mt = {__index = Sprite} function Sprite.new(filename) local sprite_object = { img = load_image_from_file(filename),x = 0,y = 0 } return setmetatable(sprite_object,mt) end function Sprite:setLocation(x,y) self.x = x self.y = y end function Sprite:getDimensions() return self.img.getWidth(),self.img.getHeight() end return Sprite ---------------------------------- -- button.lua ---------------------------------- local Sprite = require'sprite' local Button = {} local function build_redirector(table,func_name) local sprite_func = Sprite[func_name] if type(sprite_func) == 'function' then Button[func_name] = function(button_object,...) return sprite_func(button_object.up_sprite,...) end return Button[func_name] end end local mt = {__index = Button} -- main metatable local mt2 = {__index = build_redirector} -- nested metatable function Button.new(upSprite) return setmetatable({up_sprite = upSprite},mt) end return setmetatable(Button,mt2) ---------------------------------- -- example.lua ---------------------------------- local Sprite = require'sprite' local Button = require'button' local myUpSprite = Sprite.new('button01up.bmp') local myButton = Button.new(myUpSprite) myButton:setLocation(100,150) -- Sprite.setLocation() will be invoked with sprite object as self print(myButton:getDimensions()) -- Sprite.getDimensions() will be invoked with sprite object as self (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |