2009-05-08 7 views
10

Ich bin der Lead-Entwickler für Bitfighter, und ich benutze Benutzer-Skript-Bots mit Lua. Ich arbeite mit C++ und Lua mit Lunar, um sie zusammen zu kleben.Wie übergebe ich eine Liste von Objekten von C++ nach Lua?

Ich versuche etwas zu tun, das ich denke, sollte ziemlich einfach sein: Ich habe ein C++ Objekt in Lua (bot im folgenden Code), und ich rufe eine Methode darauf, dass (FindItems) C++ zu suchen den Bereich um den Roboter herum und gibt eine Liste der gefundenen Objekte zurück (TestItems und andere werden hier nicht gezeigt). Meine Frage ist einfach, wie kann ich die Liste der gefundenen Elemente in C++ zusammenstellen und zurückgeben und dann über sie in Lua?

Im Grunde möchte ich in der < < < < erstellen Liste der Elemente, senden Sie es an lua >>>> Block unten, und nehmen Sie die Korrekturen füllen ich unter dem der Lua-Code selbst, enthalten müssen .

Ich habe versucht, den Code einfach aber vollständig zu halten. Hoffe, hier ist nicht zu viel! Vielen Dank!

C++ Header-

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++

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-Code CPP-Datei

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

Sie suchen nach dem Weg, um Mond zu bekommen, um eine Tabelle mit Indizes von 1 bis fillVector.size() zu erstellen.Im einfachen Lua würde das durch Erstellen einer Tabelle und Hinzufügen der Elemente geschehen. Ich weiß nicht genug über Mond, um in diesem Rahmen spezifische Ratschläge zu geben. – RBerteig

+0

Ja, das stimmt absolut, und da stecke ich fest. Ich kann mehrere numerische Elemente zu einer Tabelle hinzufügen, weiß aber nicht, wie mehrere Benutzerdatenelemente hinzugefügt werden. – Watusimoto

+0

bot = LuaRobot (Roboter) - Dies ist eine Referenz auf unseren Bot --- Bitte, wie Sie das tun, wie bekommen Sie einen Verweis auf Ihren C++ Roboter? Ich habe versucht, eine Methode zu erstellen getCurrent (luastate *) lunar :: push (this) aber es funktioniert nicht .. Ich bitte dich .. – Icebone1000

Antwort

7

So müssen Sie Datei einen Vektor und p füllen Das zu Lua. Es folgt ein Beispielcode. Anwendungen ist ein Std :: Liste.

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

Ich erstelle eine Tabelle und fülle sie mit den Daten in meiner Liste.

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; 
} 

Dies lässt mich mit einem Array im Stapel. Wenn es zu Lua zurückgegeben wurde, dann könnte ich schreiben folgende:

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

Natürlich so weit, dies wird mir nur einen Lua Array von Strings. ein Array von Lua Um Objekte wir optimieren Sie Ihre Methode nur ein bisschen:

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

Dieses perfekt funktioniert. Um zu klären, wer andere dies lesen, die Methode

item->push(L) 

ist

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

Durch diese in einem Verfahren einkapseln, ist es möglich, die findItems zu machen Agnostiker zu dem, was es zu finden.

Vielen Dank für die Hilfe!

+1

Wow - es ist möglich, ein völlig anderer Benutzer auf einem anderen Computer mit dem gleichen Benutzernamen zu sein! Wer wusste? – Watusimoto

Verwandte Themen