2013-11-01 1 views
1

In this guide 테이블에 몬스터를 추가하고 테이블에서 몬스터의 건강을 감소시키는 함수가 생성되었습니다.LuaPlus는 C++에서 테이블을 조작합니다

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++ 측면에서이 함수를 호출 할 수 있습니다 :

당신은 쉽게 루아 스크립트에서이 같은 두 functons를 사용할 수 있습니까?

나는 원래 사람을 의미 : ObjectMgr::CreateObejct(), ObjectMgr::GetObjectByIndex()Monster::Hurt()

나는이 문제를 알아 내려고에 8 시간 이상을 지출! 그러나 아무것도 작동하지 않았습니다. :

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입니다 : 파일 Monster.hpp보고에서

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

답변

2

:

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

이 나에게 다음과 같은 오류를 제공합니다 :/

내 최고의 시도는 아마이

했다 C++ shared_ptr. 그래서 구문, 당신은 같은 -> 연산자 몬스터의 멤버를 호출해야합니다 :

// ... 
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