LuaPlus在C++中操作表格。

在此指南中创建了函数来将怪物添加到表格中,并从表格中减少怪物的健康值。

您可以轻松地从 Lua 脚本中使用这两个函数:

monster = objectMgr:CreateObject("HotMamma",5);
monster:Hurt( 1 ) --减少1点生命值
--或
objectMgr:CreateObject("HotMamma",5);
monster = objectMgr:GetObject(0)
monster:Hurt( 1 )

但我如何从 C++ 方面调用这些函数呢?

我的意思是原始函数:ObjectMgr::CreateObject()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”

点赞
用户234175
用户234175

从查看文件 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);
2013-11-01 13:32:59