我有一個C++類,它可以組織屏幕上可以繪製的部分,稱爲Canvases。在Lua中創建回調函數
我想從Lua(我已經這樣做)創建這些畫布,C++代碼會跟蹤它們並將它們呈現在屏幕上。
但畫成油畫,我希望能夠做的是從LUA,所以我想就是這樣的:
local c1 = foo.createCanvas("test", 60, 60, 300, 200);
c1:onPaint = function(params)
self:clear(1, 0, 0, 1);
self:moveTo(10, 10);
self:lineTo(100, 100);
end
createCanvas都在裏面foo的,明確的,的moveTo功能,lineTo是由createCanvas創建的畫布對象的函數。
所以,現在,當foo開始渲染所有內容時,它應該會看到在畫布「test」中定義了onPaint函數,並且應該在渲染到屏幕之前先調用此函數。
我該怎麼做?
畫布是C++中的lua元對象,聲明瞭__index和__newindex。我認爲我應該通過__newindex發現onPaint將被定義。我怎樣才能得到這個功能?
boost::shared_ptr<Canvas> **pppCanvas = (boost::shared_ptr<Canvas> **)luaL_checkudata(L, 1, "Canvas");
std::string key = lua_tostring(L, 2);
if (key == "onPaint")
{
// sometype x = lua_tofunction(L, 3);???
}
else
luaL_error(L, "Canvas - member '%s' is not defined", key.c_str());
return 0;
那麼我應該使用什麼類型的函數,我應該使用什麼函數來獲得這個函數呢?
然後,我將如何調用這個lua函數?我怎樣才能知道函數是否已經定義在第一位?
編輯:
我發現這個話題:click 它顯示瞭如何對一個Lua函數的引用,並要求它回來。 現在唯一的問題是:luaL_ref沒有采用堆棧索引,所以我不知道如何從上面的__newindex函數中的堆棧中取得函數。
我的問題現在解決了(似乎無法設置這個問題來解決,因爲低信譽),因爲我實際上需要堆棧中的最後一個項目。但我想知道是否有人知道我可以如何在堆疊中放入另一個物品。
總之:問題就迎刃而解了
D.
你考慮使用痛飲: 根據你的榜樣更新?這對於這種整合非常有幫助。請參閱http://www.swig.org/ – vines 2011-05-30 10:36:52
不,這不是一個選項。 LUA集成已經從頭開始編寫,並且很多代碼已經存在。我相信對於我的問題有一個簡單的解決方案。 – scippie 2011-05-30 11:02:27