2013-11-01 58 views
1

In this guide創建函數可將怪物添加到表格並降低表格中怪物的運行狀況。LuaPlus從C++操縱表格

您可以方便地使用兩個functons這樣從LUA腳本:

monster = objectMgr:CreateObject("HotMamma",5); 
monster:Hurt(1) --decrease health by 1 
--or 
objectMgr:CreateObject("HotMamma",5); 
monster = objectMgr:GetObject(0) 
monster:Hurt(1) 

但我怎麼能調用從C++側這些功能呢?

我指的是原有的:ObjectMgr::CreateObejct()ObjectMgr::GetObjectByIndex()Monster::Hurt()

我花費超過8小時試圖弄清楚這一點!但沒有任何工作。 :/

我最好的嘗試很可能是這樣的:

// CreateObject modified to return pMonster and accept normal arguments 
MonsterPtr monster = objectMgr.CreateObject(pState, "HotMamma", 5); 
monster.Hurt(1); 

這給了我下面的錯誤:

class "std::tr1::shared_ptr" has no member "Hurt"

回答

2

從查看文件Monster.hpp

class Monster 
{ 
// ... 
public: 
    Monster(std::string& name, int health); 

    void Hurt(int damage); 

    void Push(LuaPlus::LuaState* pState); 
    int Index(LuaPlus::LuaState* pState); 
    int NewIndex(LuaPlus::LuaState* pState); 
    int Equals(LuaPlus::LuaState* pState); 
}; 

typedef std::shared_ptr<Monster> MonsterPtr; 

MonsterPtr是一個C++ shared_ptr。所以語法,你就必須Monster的成員打電話與->運營商,如:

// ... 
monster->Hurt(1); 

編輯:似乎有是一些設置參與。該方法的簽名:

int ObjectMgr::CreateObject(LuaPlus::LuaState* pState) 

只接受LuaState *作爲其唯一的參數,它不超載所以在你上面的例子呼叫行不通的。你必須做的是在調用之前將參數推入棧中。設置和使用應該如下所示:

LuaObject _G = pState->GetGlobals(); 
LuaObject name, life; 
name.AssignString(pState, "HotMamma"); 
life.AssignInteger(pState, 5); 

_G["objectMgr"].Push(); 
name.Push(); 
life.Push(); 

MonsterPtr monster = objectMgr.CreateObject(pState); 
monster->Hurt(1); 
+0

謝謝噓! – Forivin

+0

@Forivin如果遇到從C++調用它的問題,我已經添加了一些關於'objectMgr.CreateObject'的更多信息。 – greatwolf

+0

嗯,我修改了CreateObject來接受普通的參數。所以怪物 - >赫特(1);實際上做了這項工作。 :p我不能再從Lua那邊叫它,但是..所以我一定要檢查一下!謝謝謝謝。 :) – Forivin