lua — таблица манипулирования LuaPlus из переполнения стека

В этом руководстве Функции создаются для добавления монстра в таблицу и уменьшения здоровья монстра из таблицы.

Вы можете легко использовать две такие функции из сценария 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»

1

Решение

Смотря на файл 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]