Thursday, April 16, 2009

<algorithm>

Bon. J'aurais été en C, j'aurais ajouté "GOB* prev=0; GOB* next=0;" dans ma structure et on en aurait plus parlé. Mais je suis en C++. Mes sprites (Graphic OBjects) doivent être listés par "caste" (héro ou vilain) pour les tests de collisions et je cherchais désespérément une manière simple d'effacer un élément donné d'un vecteur C++ dans le desctructeur. Je dis bien "simple", donc

for (std::vector<x*>::iterator b=v.begin(), e=v.end(); b!=e ;b++)
if(*b==this) v.erase(b);
n'est pas vraiment un candidat (quoi que si c'est correct, c'est presque compact).

Eh bien je cherchais mal. De même que std::vector ne possède pas de méthode "sort()", ce qui correspondrait aux "fonctions built-in" sur les listes dans le langage PERL sont des algorithmes dans <algorithm> en C++. Il faudra donc écrire:
v.erase(std::remove(v.begin(), v.end(), this), v.end());
Sauf que "std::remove does not change the size of the container,it moves elements forward to fill gaps created and returns the new 'end' position.". Ah. Bin j'aimais autant écrire mon "@list = grep { $_ != $remove_me } @list", à ce prix-là, hein ...

Vous me voyez un peu commencer à décaler la moitié de mes sprites dans leur tableau chaque fois que l'un d'eux sort de l'écran, vous ? Passer à un hachage ? Il y a bien "std::set" qui ferait l'affaire, et c'est le genre de réaction que j'ai en PERL quand ma liste n'a finalement pas si besoin que ça d'être ordonnée et que j'en retire régulièrement des éléments.

Ceci dit, j'ai franchement l'impression que je vais faire l'impasse sur tout ce bazar, et utiliser la solution 'naturelle' sachant que je travaille en réalité avec des tableaux de taille ajustable et pas des listes liées:
v[this.pos]=v[v.size()-1];
v.erase(v.end()-1);
v[this.pos].setpos(this.pos);
Remarque, il y aurait une alternative plus "C++ienne": std::list, pour laquelle l'insertion et l'effacement sont en temps constant à condition d'avoir déjà un iterateur positionné correctement. En principe insert(v.end(), this) nous renvoie un tel itérateur, la question étant 'ai-je le droit de le conserver malgré le fait que ma liste va subir des modifications ?' ...
Selon les gurus, oui. Pour une liste, en tout cas, seuls les itérateurs pointant sur l'objet supprimé sont invalidés". Ce n'est pas le cas pour les vecteurs ni pour la plupart des séquences.

On aura donc au final :
class GameObject {
public:
 typedef std::list<GameObject*> GobList;
private:
 static GobList gobs[2];
 GobList::iterator self;
public:
 enum CAST { HERO, EVIL, DONTLIST };
 enum CAST cast;
};

GameObject::GameObject(CAST c) : self(0), cast(c) {
 if (c!=DONTLIST)
   self=gobs[c].insert(gobs[c].end(), this);
}

GameObject::~GameObject() {
 if (cast != DONTLIST) gobs[cast].erase(self);
}
Et je garde une liste de pointeurs: je n'ai pas envie de venir tout embrouiller avec les constructeurs de copies et autres ^^"
PS: Merci à Cyril pour la relecture et les conseils sur les templates.

6 comments:

Romain Villeneuve said...

Connais tu le logiciel game maker version 7 de yoyogames il permet de faire plein de sortes de jeux comme les jeux de plateformes.

Je songe à développer un jeu de plateforme avec ce logiciel. a+

PypeBros said...

Je connais vaguement. J'ai dû en essayer une version démo sans vraiment être convaincu.

Romain Villeneuve said...

Ok et de ta manière est-ce complex de faire un engin pour un jeux plateforme car moi je ne m'y connais pas bcp en programmation a part le qbasic sur mon vieux pc à l'époque je programmais quelques petite lignes de code mais sans plus.

C'est surement long mais est-ce qu'il exsiste des engin open source que l'on peut faire seulement des map un peu comme rpgmaker mais en plateforme.

PypeBros said...

Je n'en ai essayé aucun, mais tu pourrais essayer de détourner le moteur de SuperTux ou jeter un coup d'oeil à Pygame.

Sur la DS, tu peux aussi jeter un oeil au code de "Inside the Machine" de Morukutsu. Pas à franchement un game maker, mais un bon game engine qui te permettra de te lancer dans le bain.

Romain Villeneuve said...

J'ai regarder bcp pygame et je dois dire que cela m'interesse bcp. Je ne sais pas par conte si il exsiste un éditeur de niveau pour l'engin pygame ou si je dois le faire moi même.

Je songe moi aussi à développer un jeu de plateforme. Tu pourras aller suivre l'aventure sur mon blog et me laisser des commentaires lors de la progression du jeu.

a+ et bonne continuation avec ton projet.

PypeBros said...

D'après Wikipedia, ça existerait sur http://www.imitationpickles.org/pgu/wiki/index

Je me réjouis de suivre ça sur ton blog ;)