gpt4 book ai didi

delegates - 在 Lua 中调用委托(delegate)

转载 作者:行者123 更新时间:2023-12-01 02:27:56 26 4
gpt4 key购买 nike

我正在使用 Lua 上的游戏框架。现在,如果我想创建一个按钮,我会为我的按钮创建一个表格,该表格将包含功能和两个 Sprite (按钮向下和向上)。

Sprite 有很多基本功能,如 setLocation(self, x, y)getDimensions(self) .

我不想创建很多这样的功能:

function button.setLocation(self, x, y)
self.buttonUpSprite(self, x, y)
end

但我想“自动”将大多数对我的按钮的调用直接委托(delegate)给 buttonUp Sprite 。

只需设置按钮表的元表 __index指向 Sprite 将转发 Sprite 的函数调用,但 self reference 仍然指向按钮,而不是我想要操作的 Sprite 。

有没有一种干净的方式来做这个委托(delegate)团?

最佳答案

您可以使用嵌套元表按需自动构建重定向功能:

----------------------------------
-- 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

关于delegates - 在 Lua 中调用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14919282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com