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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
{{"typeagent1", {x1, y1}}
 {"typeagent2", {x2, y2}}
 {"typeagent3", {x3, y3}}
}
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.

Mon problème est de créer un tel tableau et de le pousser sur la pile.

Voici le code auquel je suis arrivé:

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();
}
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.

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