LuaPlus 从C++操作表

LuaPlus manipulate table from C++

本文关键字:操作表 C++ LuaPlus      更新时间:2023-10-16

在本指南中,创建函数是为了向表中添加怪物并降低表中怪物的生命值。

您可以轻松地从 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 的成员,如下所示:

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