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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
void load();
void checkEvents(std::vector<any> &, const int);
void do_something(std::vector<any> &, const int);
void do_other(std::vector<any> &, const int);
Object obj1, obj2;
int main()
{
load();
while(OK)
{
obj1.draw(obj1.param);
obj2.draw(obj2.param);
}
//...
obj1 -= do_something; //A Partir de maintenant, ne fera plus
//do_something() quand il sera dessiné
while(!OK)
{
obj1.draw(obj1.param);
}
return 0;
}
void load() //Permet de configurer l'objet (points, etc...)
{
std::vector<Point> vect; //Vecteur temporaire qui contient les points
vect.push_back(Point(0,0,0));
vect.push_back(Point(0,0,1));
//...
//associe un ensemble de points et une couleur
obj1.push_back(Color(255,255,0,255),vect);
vect.erase();
vect.push_back(Point(1,0,0));
vect.push_back(Point(0,1,0));
//...
obj1.push_back(Color(0,255,255,255),vect);
obj1.draw_mode = MODE1;
obj1.onDraw += checkEvents; //Ajoute un pointeur sur une fonction dans un attribut de obj1.
//Ces fonctions seront éxécutées à cahque fois que la méthode "Object::draw(std::vector<any> &)" est appelée
obj1.push_param(Point(0,0,0)); //Ajoute un point dans le conteneur Object::param contenant des "any"
//(il sera en fait automatiquement lu par la 1ère fonction)
obj1.onDraw += do_something;
obj1.push_param(Type_A(/*...*/)); //Lu automatiquement par la 2ème fonction
//.........
obj2.onDraw() += do_other;
obj2.push_param(Type_B());
}
void checkEvents(std::vector<any> & v_param, const int i)
//Ici, besoin d'un paramètre "origine" que l'on retrouverait a chaque foi
//et qui appartiendrait à un objet, ou justement qui pourrait ne pas lui appartenir
//
//Le paramètre i qui est passé ici représente le numéro de la fonction, dans l'ordre des ajouts
{
Point *origine = any_cast<Point>(v_param[i]); //On a besoin du paramètre associé à cette fonction
//Ca pourrait facilement ce généraliser (cad plusieurs paramètres associés à une fonction)
//notamment en passant un std::vector<int> plutôt qu'un int, mais je n'y ai pas encore
//bien réfléchi et je ne sais pas la forme exacte que ça peut prendre
if(LEFT)
{
(*origine).X -= 2;
translate(*origine);
}
}
void do_something(std::vector<any> & v_param, const int i)
//Ici besoin d'un autre parametre à conserver tout au long de l'existence de l'objet,
//mais "inatendu", cad je ne savait pas que l'utilisateur allait définir un type "Type_A"
{
Type_A *monParam = any_cast<Type_A>(v_param[i]);
_do_something(monParam);
} |