Bonjour à tous.
Je suis en train de faire une petite plate-forme multi-agents, et je voudrais externaliser une fonction vers lua.
Je souhaiterais appeler une fonction lua avec en paramètre un tableau de la forme suivante:
Ce tableau représente les agents perçus par l'agent courant. La fonction lua doit donc pouvoir itérer sur ces agents (idéalement uniquement sur les agents d'un type donné) et renvoyer un vecteur et un angle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 {{"typeagent1", {x1, y1}} {"typeagent2", {x2, y2}} {"typeagent3", {x3, y3}} }
Mon problème est de créer un tel tableau et de le pousser sur la pile.
Voici le code auquel je suis arrivé:
Malheureusement, je crois comprendre que la boucle ne fait que réécrire sur la première ligne, et je ne peux pas itérer comme je le voudrais en LUA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 void Bird::live(){ std::vector<Perception*> perceptions = getPerceptions(); lua_getglobal(m_state, "live"); if(!lua_isfunction(m_state, -1)){ Log::i("BIRD") << "Lua function 'live' not found!"; lua_pop(m_state, 1); wander(); }else{ if(perceptions.size() > 0){ lua_newtable(m_state); for(unsigned int i = 0; i < perceptions.size(); ++i){ lua_newtable(m_state); lua_pushstring(m_state, "bird"); lua_setfield(m_state, -2, "type"); lua_newtable(m_state); lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().x); lua_setfield(m_state, -2, "x"); lua_pushnumber(m_state, perceptions.at(i)->getObject()->getPosition().y); lua_setfield(m_state, -2, "y"); lua_setfield(m_state, -2, "coord"); lua_setfield(m_state, -2, "target"); } }else{ lua_pushnil(m_state); } lua_call(m_state, 1, 0); } wander(); }
NB: je suis débutant en LUA et en binding C/LUA, il y a peut-être une meilleure façon de faire cela, je suis preneur...
Merci d'avance, Seeme
Partager