目前覺得比較好的做法,C++寫具體控件效果,lua處理事件響應(yīng)
<EventList>
<Event Name="OnCreate" File="LogonWnd.xml.lua" Func="MSG_OnCreate"/>
</EventList>
function MSG_OnCreate(self)
i = 0
print(self)
end
self為事件源注冊到lua中的類型事例。
迅雷界面庫中還有另一種做法:
function OnInit()
local owner = self:GetOwner()
local objFactory = XLGetObject("Xunlei.UIEngine.ObjectFactory")
local newIcon = objFactory:CreateUIObject("icon2","ImageObject")
local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
newIcon:SetResProvider(xarManager)
newIcon:SetObjPos(45,165,45+70,165+70)
newIcon:SetResID("app.icon2")
local function onClickIcon()
XLMessageBox("Don't touch me!")
end
newIcon:AttachListener("OnLButtonDown",true,onClickIcon)
self:AddChild(newIcon)
end
直接在lua層處理事件,貌似更舒服了。但是所引用的函數(shù)不能是上層C的,也不能有self參數(shù)了,否則內(nèi)存管理又是一大害處。
這里的AttachListener應(yīng)該和上層的Wnd類或者對應(yīng)的派發(fā)消息的CPP里邊的《EventList》關(guān)聯(lián),貌似這樣能動態(tài)添加消息處理器,而且不用擔(dān)心對象生命周期管理。
觀摩了一下迅雷的sdk給的粒子,發(fā)現(xiàn)他們可能修改了虛擬機(jī),發(fā)現(xiàn)在不同的文件中會有相同的函數(shù),而且都是全局的,聯(lián)想到前面配置的時(shí)候要給定一個(gè)文件名和一個(gè)函數(shù)名,要么就傻逼的每次調(diào)用前都要loadfile一次,不然很可能修改lua虛擬機(jī),或者lua api支持按文件索引。
問題:cpp向lua派發(fā)事件的時(shí)候函數(shù)名,名字沖突。迅雷的做法是文件名+函數(shù)名索引,但是目前我的技術(shù)積累做不到。
解決辦法:
1.靠自己約定,即自己確保所有l(wèi)ua文件中都沒有相同的函數(shù)
2.參考魔獸世界,然后加點(diǎn)佐料的做法:<scripts file="LogonWnd.lua" /> <Event EventName="BtnClick" EventSink="LogonWnd.BtnClick">
也就是默認(rèn)每個(gè)文件名中的所有函數(shù)都在以文件名為名字控件的作用域下