1

在本指南中,创建了一些函数来将怪物添加到桌子上并降低桌子上怪物的生命值。

您可以从 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”没有成员“伤害”

4

1 回答 1

2

从查看文件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-01T13:32:59.557 回答