В этом руководстве Функции создаются для добавления монстра в таблицу и уменьшения здоровья монстра из таблицы.
Вы можете легко использовать две такие функции из сценария 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 );
Это дает мне следующую ошибку:
класс «std :: tr1 :: shared_ptr» не имеет члена «Hurt»
Смотря на файл 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->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);
Других решений пока нет …