2011-05-30 77 views
1

我有一個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.

+0

你考慮使用痛飲: 根據你的榜樣更新?這對於這種整合非常有幫助。請參閱http://www.swig.org/ – vines 2011-05-30 10:36:52

+1

不,這不是一個選項。 LUA集成已經從頭開始編寫,並且很多代碼已經存在。我相信對於我的問題有一個簡單的解決方案。 – scippie 2011-05-30 11:02:27

回答

1

看來你可以使用lua_call以滿足您的需求。請注意,swig不支持lua afaik中的導演,因此不是一種選擇。

編輯

lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall"); /* function to be called */ 
lua_pushinteger(L, 3); // parameter is 3 
lua_call(L, 1, 1); //call with 1 parameter, 1 result 
lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall"); /* function to be called */ 
lua_Number result = lua_tonumber(L,1) 
+0

需要更多信息... – scippie 2011-05-30 11:13:37

+0

否:在這種情況下,應該知道回調函數的名稱,但我希望能夠在LUA中註冊我自己的anonymouse回調函數(以便每個Canvas對象都有自己的回調函數) – scippie 2011-05-30 11:27:16

+0

這只是一個字符串,它是在運行時檢查,沒有什麼阻止你註冊它而不是硬編碼。 – Bruce 2011-05-30 14:24:54