2010-09-22 5 views
0

Je me demandais si la configuration suivante fonctionnerait pour un petit jeu:Création Timers en C++ en utilisant Lua

laisse supposer que je possède les fonctions suivantes enregistrées à Lua comme ceci:

lua_register(L, "createTimer", createTimer); 
lua_register(L, "getCondition", getCondition); 
lua_register(L, "setAction", setAction); 

Où: (laissant le type derrière la vérification)

int createTimer(lua_State* L){ 
    string condition = lua_tostring(L, 1); 
    string action = lua_tostring(L, 2); 
    double timer = lua_tonumber(L, 3); 
    double expiration = lua_tonumber(L, 4); 

    addTimer(condition, action, timer, expiration); // adds the "timer" to a vector or something 
return 1; 
} 

appel de cette fonction en lua par:

createTimer("getCondition=<5", "setAction(7,4,6)", 5, 20); 

Puis-je puis procédez comme suit (?):

// this function is called in the game-loop to loop through all timers in the vector 
void checkTimers(){ 
    for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) { 
     if(luaL_doString(L, *it->condition)){ 
      luaL_doString(L, *it->action) 
     } 
    } 
} 

Est-ce que ce travail? LuaL_doString passerait-il "getCondition = < 5" au moteur d'état de lua, où il appellerait la fonction C++ getCondition(), puis verrait s'il est = < 5 et retournerait vrai ou faux? Et serait la même chose pour luaL_doString (L, "setAction (7, 4, 6)"); ? De plus, serait-ce un moyen approprié de créer des temporisateurs en accédant à lua une seule fois (pour les créer) et laisser C++ gérer le reste, appelant seulement les fonctions C++ à travers lua et laissant Lua traiter uniquement de la logique?

Merci d'avance.

Répondre

1

Vous pouvez modifier la chaîne de condition à "return getCondition()<=5" sinon le bloc de chaîne ne sera pas compilé ou exécuté. Ensuite, vérifiez la valeur de retour booléenne sur la pile lorsque le luaL_doString() retourne avec succès. Quelque chose comme ceci:

// this function is called in the game-loop to loop through all timers in the vector 
void checkTimers(){ 
    for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) { 
     lua_settop(L, 0); 
     if(luaL_doString(L, *it->condition) == 0 && lua_toboolean(1)){ 
      luaL_doString(L, *it->action); 
     } 
    } 
} 
+0

Ok, mais est-ce que cette configuration fonctionnerait bien globalement ou serait-il préférable de laisser Lua créer des minuteurs en C++ ou serait-ce une bonne configuration? Deuxièmement, la condition * it-> fonctionne-t-elle réellement pour un vecteur (si je ne me trompe pas seulement * it-> first * it-> second fonctionnerait? Et si tel est le cas, quelle serait la meilleure structure à stocker? les données avec le ? Ma réaction initiale est de créer une structure et simplement remplir un vecteur avec ces structures, mais cela ne fait que me tromper: S – Karrok

0

Vous ne pouvez pas interrompre Lua pendant qu'il fonctionne. Le mieux que vous puissiez faire est de mettre un drapeau et ensuite gérer l'interruption à un moment sûr. L'interpréteur autonome utilise cette technique pour gérer les interruptions de l'utilisateur (contrôle-C). Cette technique est également utilisée dans ma bibliothèque lalarm, qui peut être utilisée pour implémenter des rappels de minuterie, mais pas au niveau élevé que vous voulez.

+0

Répondre à une autre question? Ne pensez pas que je suis insinué partout où je voulais interrompre Lua, merci quand même :) – Karrok

+0

Je l'ai supposé ainsi de votre utilisation de la minuterie. – lhf