2009-05-08 4 views
10

私はBitfighterのリード開発者であり、Luaを使ってユーザスクリプト化されたボットを追加しています。私はLunarを使ってC++とLuaを一緒に接着しています。C++からLuaにオブジェクトのリストを渡すにはどうすればよいですか?

私はかなりシンプルでなければならないことをやろうとしています:私はLua(以下のコードではボット)にC++オブジェクトを持っていて、C++に検索させる(findItems)ロボット周辺の領域を検索し、見つかったオブジェクトのリストを返します(ここでは示されていないTestItemsなど)。私の質問は、単にC++で見つけたアイテムのリストをアセンブルして返し、それをLuaで繰り返し処理する方法です。

基本的に、私は < < < <ブロックの下>>>> LUAにそれを返す、アイテムのリストを作成し、私はLuaのコード自体に必要がある場合があります任意の修正を行い、その下に含まに記入したいです。

私はコードを単純ではあるが完全なものにしています。あまりにもここではないことを願っています!ありがとう!

C++ヘッダーが

class TestItem : public LuaObject 
{ 

public: 
    TestItem();  // C++ constructor 

    ///// Lua Interface 

    TestItem(lua_State *L) { } ;    // Lua constructor 

    static const char className[]; 
    static Lunar<TestItem>::RegType methods[]; 

    S32 getClassID(lua_State *L) { return returnInt(L, TestItemType); } 
}; 


class LuaRobot : public Robot 
{ 
    LuaRobot();  // C++ constructor 

    ///// Lua Interface 

    LuaRobot(lua_State *L) { } ;    // Lua constructor 

    static const char className[]; 
    static Lunar<LuaRobot>::RegType methods[]; 

    S32 findItems(lua_State *L); 
} 

C++ .cppファイル

const char LuaRobot::className[] = "Robot";  // Class name in Lua 
// Define the methods we will expose to Lua 
Lunar<LuaRobot>::RegType LuaRobot::methods[] = 
{ 
    method(LuaRobot, findItems), 
    {0,0} // End method list 
}; 


S32 LuaRobot::findItems(lua_State *L) 
{ 
    range = getIntFromStack(L, 1); // Pop range from the stack 
    thisRobot->findObjects(fillVector, range); // Put items in fillVector 

    <<<< Create list of items, return it to lua >>>> 

    for(int i=0; i < fillVector.size(); i++) 
     do something(fillVector[i]); // Do... what, exactly? 

    return something; 
} 


///// 
const char TestItem::className[] = "TestItem";  // Class name in Lua 

// Define the methods we will expose to Lua 
Lunar<TestItem>::RegType TestItem::methods[] = 
{ 
    // Standard gameItem methods 
    method(TestItem, getClassID), 
    {0,0} // End method list 
}; 

Luaのコード

bot = LuaRobot(Robot) -- This is a reference to our bot 

range = 10 
items = bot:findItems(range) 

for i, v in ipairs(items) do 
    print("Item Type: " .. v:getClassID()) 
end 
+0

lunarで1からfillVector.size()までのインデックスを持つテーブルを作成する方法を探しています。普通のLuaでは、それはテーブルを作成して要素を追加することによって行われます。私は、そのフレームワークで具体的な助言を与えるために月面について十分に知りません。 – RBerteig

+0

はい、それは絶対に正しいことです、そして、それは私が立ち往生したところです。テーブルに複数の数値項目を追加できますが、複数のユーザーデータ項目を追加する方法はわかりません。 – Watusimoto

+0

bot = LuaRobot(Robot) - これは私たちのボットへの参照です。どうぞ、どうやってC++の作成したロボットへの参照を取得しますか?私はgetCurrent(luastate *)lunar :: push(this)というメソッドを作成しようとしましたが、うまくいきませんでした。私はあなたに尋ねます.. – Icebone1000

答えて

7

を提出だからあなたは、ベクトルとpを入力する必要がありますそれをルアに捧げる。 いくつかのコード例を次に示します。 アプリケーションは、std :: listです。

typedef std::list<std::string> Applications; 

私はテーブルを作成し、それを私のリストのデータで埋める。

int ReturnArray(lua_State* L) { 
    lua_createtable(L, applications.size(), 0); 
    int newTable = lua_gettop(L); 
    int index = 1; 
    Applications::const_iterator iter = applications.begin(); 
    while(iter != applications.end()) { 
     lua_pushstring(L, (*iter).c_str()); 
     lua_rawseti(L, newTable, index); 
     ++iter; 
     ++index; 
    } 
    return 1; 
} 

これにより、スタックに配列が残されます。それはLuaのに戻した場合は、その後、私は次のように書くことができます:もちろん

for k,v in ipairs(ReturnArray()) do 
    print(v) 
end 

これまでのところ、これはちょうど私文字列のLuaの配列を取得します。 Luaのオブジェクトの配列を取得するために、私たちは自分のメソッドビットを微調整:

S32 LuaRobot::findItems(lua_State *L) 
{ 
    range = getIntFromStack(L, 1); // Pop range from the stack 
    thisRobot->findObjects(fillVector, range); // Put items in fillVector 

    // <<<< Create list of items, return it to lua >>>> 

    lua_createtable(L, fillVector.size(), 0); 
    int newTable = lua_gettop(L); 
    for(int i=0; i < fillVector.size(); i++) { 
     TestItem* item = fillVector[i]; 
     item->push(L); // put an object, not a string, in Lua array 
     lua_rawseti(L, newTable, i + 1); 
    } 
    return 1; 
} 
1

これは完璧に動作します。これを読んでいる他の人に明確にするために、方法

item->push(L) 

は方法でこれをカプセル化することにより

void push(lua_State *L) { Lunar<TestItem>::push(L, this); } 

あり、それが見つけているものにfindItemsは不可知論にすることが可能です。

ありがとうございました!

+1

Wow - 同じユーザー名を持つ別のコンピュータで全く異なるユーザーになる可能性があります。誰かわかったね? – Watusimoto

関連する問題