2009-05-08 10 views
10

Je suis le développeur principal pour Bitfighter, et j'ajoute des bots scriptés par l'utilisateur en utilisant Lua. Je travaille avec C++ et Lua en utilisant Lunar pour les coller ensemble. J'essaie de faire quelque chose que je pense devrait être assez simple: J'ai un objet C++ dans Lua (bot dans le code ci-dessous), et j'appelle une méthode sur celui-ci (findItems) qui provoque la recherche C++ la zone autour du robot et renvoyer une liste des objets trouvés (TestItems et autres non affichés ici). Ma question est simplement comment puis-je assembler et retourner la liste des éléments trouvés dans C++, puis itérer sur eux dans Lua?Comment passer une liste d'objets de C++ à Lua?

Fondamentalement, je veux remplir le < < < < Créer liste des articles, retourner au bloc lua >>>> ci-dessous, et apporter des corrections je besoin dans le code Lua lui-même, examinés ci-après . J'ai essayé de garder le code simple mais complet. J'espère qu'il n'y a pas trop de choses ici! Merci!

C++ fichier en-tête

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++ fichier .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 
}; 

code 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

Vous cherchez la façon d'obtenir lunar pour créer une table avec des index allant de 1 à fillVector.size().En plaine Lua, cela serait fait en créant une table et en ajoutant les éléments. Je ne sais pas assez sur lunar pour donner des conseils spécifiques dans ce cadre. – RBerteig

+0

Oui, c'est tout à fait vrai, et c'est là que je suis coincé. Je peux ajouter plusieurs éléments numériques à une table, mais je ne sais pas comment ajouter plusieurs éléments de données utilisateur. – Watusimoto

+0

bot = LuaRobot (Robot) - Ceci est une référence à notre bot --- S'IL VOUS PLAÎT, comment vous faites cela, comment obtenez-vous une référence à votre robot C++ créé ?? J'ai essayé de créer une méthode getCurrent (luastate *) lunaire :: push (ce), mais il ne marche pas work..I .. vous en prie – Icebone1000

Répondre

7

donc vous devez remplir un vecteur et p Ohh ça à Lua. Un exemple de code suit. Applications est un std :: liste. Je crée une table et la remplis avec les données de ma liste. Cela me laisse avec un tableau dans la pile. Si elle était retournée à Lua, alors je pourrais écrire:

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

Bien sûr, à ce jour, ce me reçoit un tableau de Lua chaînes. Pour obtenir un tableau de Lua objets nous venons de modifier votre méthode un peu:

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

Cela fonctionne parfaitement. Afin de clarifier à d'autres qui sont en train de lire ceci, la méthode

item->push(L) 

est

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

En encapsulant ce dans une méthode, il est possible de faire les findItems agnostique à ce qu'il recherche.

Merci pour votre aide!

+1

Wow --il est possible d'être un utilisateur totalement différent sur un autre ordinateur avec le même nom d'utilisateur! Qui savait? – Watusimoto

Questions connexes