1

このガイドでは、テーブルにモンスターを追加し、テーブルからモンスターの健康を減らす関数が作成されます。

lua スクリプトから次のように 2 つの関数を簡単に使用できます。

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" がありません

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;

MonsterPtrC++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 に答える