2014-01-17 55 views
0

在一個名爲爲test_class類,我有一個函數:luabind沒有推出功能我已經定義它

shoot_a_bullet(int damage) 
{ 
    cout << "runned"; // i had #using namespace std 
} 

我曾這樣定義以下

luabind::module(myLuaState)[ 
    luabind::def("shoot_a_bullet", &Test_Class::shoot_a_bullet) 
]; 

的代碼並按照代碼沒給我一個屏幕上的輸出

luaL_dostring(myLuaState,"shoot_a_bullet(134)\n"); 

PS:我確實把cin.get()結束,這不是問題。

編輯: 我這樣做的主要目的是讓我的腳本人物/敵人能夠直接添加東西到持有子彈/效果/敵人等的矢量。
我不能讓這個函數變成靜態的原因是因爲我需要主遊戲階段的指針才能讓它工作。

以下代碼工作正常

void print_hello(int number) { 
    cout << "hello world and : " << number << endl << "number from main : " << x << endl; 
} 

int x; //and the main with a global value 

int main() 
{ 
    cin >> x; 
    lua_State *myLuaState = luaL_newstate(); 

luabind::open(myLuaState); 

luabind::module(myLuaState)[ 
    luabind::def("print_hello", print_hello) 
]; 

luaL_dostring(
    myLuaState, 
    "print_hello(123)\n" 
    ); 
cin.get(); 
cin.get(); 

lua_close(myLuaState); 
} 

我需要一種方法來做到這一點的一類,這不是主要的

+0

在類中或外部聲明'shoot_a_bullet'函數嗎? – Caesar

+0

嘗試打印出錯誤。您可能還有其他問題 –

+0

@Dmitry Ledentsov沒有錯誤 – MadokaMagica

回答

2

你不能這樣註冊的成員函數。什麼你正在做的是像C++中的以下內容:

Test_Class::shoot_a_bullet(134); 

MSVC例如調用「非靜態成員函數的非法調用」,這就是它到底是什麼。

請參閱Luabind文檔中關於如何將類綁定到Lua的部分Binding classes to Lua。然後你需要創建這個類的一個對象並在其上調用它的功能,例如在Lua中有myobject:shoot_a_bullet(134):是作爲第一個參數傳遞myobject的句法糖)。

要查看錯誤,您應該首先檢查返回值luaL_dostring。如果返回true,則呼叫失敗。該消息被壓入的Lua棧的字符串,方便與

lua_tostring(myLuaState, -1); 

在這種情況下,它應該像

No matching overload found, candidates: 
void shoot_a_bullet(Test_Class&) 

說明:當您註冊一個成員函數作爲一個自由的,luabind在前面添加一個額外的引用參數,以便該方法實際上在爲其傳遞的參數對象上調用。

+0

裏面有人需要確定作者是否使靜態成員 –

+0

現在有些東西讓我更加困擾,因爲它返回true,仍然沒有輸出 – MadokaMagica

+0

'true'確實意味着發生了錯誤(而'false'意味着成功)。這有點違反直覺。請參閱http://www.lua.org/manual/5.2/manual.html#luaL_dostring – Oberon

相關問題