Probleme avec la classe Vector ?!

Probleme avec la classe Vector ?! - C++ - Programmation

Marsh Posté le 07-12-2006 à 19:04:52    

Bonjour
Je réalise un shoot them up en c++ avec sdl.
J'ai tout d'abord un petit probleme, je n'arrive pas à utiliser les itérateurs de la classe vector de std.
( il me met une erreur avec cette ligne : vector<T>::iterator _ptr; )
 
Deuxiemement je n'arrive pas à gérer l'affichage de mes missiles.
Voila ma methode : lorsque j'appuis sur espace (la touche missile), j'insere un objet "missile" dans un vecteur, puis lors de l'affichage du scrolling et du vaisseau ,j'affiche aussi tout les missiles présents dans mon vecteur.
 
Mais cela ne marche pas, lorsque je clique sur espace, un coup ca marche , un coup ca plante ?!
 
Je me permet de mettre des extraits de mon code :
 
Voici tout d'abord les  fonctions permettant d'afficher un missile
 

Code :
  1. /*--------------- AfficheMissile() ---------------------------------------------*/
  2. void AfficheMissile(Missile objet )
  3. {
  4.     rctPositionMissile.x = objet.getX();
  5. rctPositionMissile.y = objet.getY();
  6.     afficherImage("images/TurboLaser.png",rctPositionMissile.x,rctPositionMissile.y);
  7. }
  8. /*--------------- AfficheVectMissile() ---------------------------------------------------*/
  9. void AfficheVectMissile( Vecteur<Missile* > M ){
  10.    
  11.     if (M.vide()) {}
  12. else{
  13.         M.moveFirst();
  14.    
  15.         // Pour tout les missiles qu'il y a dans le vecteur
  16.    for ( int i = 0; i < M.getTaille(); i++ ){
  17.       // on déplace le missile
  18.             M.get()->deplace();
  19.             // On affiche le missile
  20.             AfficheMissile( *( M.get() ) ) ;
  21.       // On va au prochain missile
  22.            M.moveNext();
  23.          }
  24.     }
  25. }


 
Puis le morceau de code gérant le jeu en lui meme :
 

Code :
  1. while (continuerApplication){
  2.         if ( scroll < 800 ){
  3.             DrawIMG( sfcImageFond, 0, ( int ) scroll, 1280, ( int ) ( 800 - scroll ),0, 0 );
  4.      DrawIMG( sfcImageFond, 0, 0, 1280, ( int ) ( 1280 - ( 800 - scroll ) ), 0,( int ) ( 800 - scroll - 1 ) );
  5.         }else{
  6.           scroll = 0;
  7.             DrawIMG( sfcImageFond, 0, ( int ) scroll, 1280, ( int ) ( 800 - scroll ),0, 0 );
  8.             DrawIMG( sfcImageFond, 0, 0, 1280, ( int ) ( 1280 - ( 800 - scroll ) ), 0,( int ) ( 800 - scroll - 1 ) );
  9.         }
  10.  scroll =  scroll + 3;
  11.         SDL_Delay( 1 );
  12.         afficherImage(joueur->getImage(),rctPositionJoueur.x,rctPositionJoueur.y);
  13.  // On affiche les missiles du joueur
  14.  AfficheVectMissile(vctMissile);
  15.         SDL_Flip(ecran);
  16.            
  17.         keystates = SDL_GetKeyState( NULL );
  18.             //Si Haut est pressé  
  19.             if( keystates[ SDLK_UP ] ) {
  20.                 if (rctPositionJoueur.y - 10 > 10)
  21.                 rctPositionJoueur.y = rctPositionJoueur.y - 10;
  22.             }
  23.             if( keystates[ SDLK_RIGHT ] ) {
  24.              if (rctPositionJoueur.x + 10 < 1180)
  25.                    rctPositionJoueur.x = rctPositionJoueur.x + 10;
  26.             }
  27.             if( keystates[ SDLK_LEFT ] ) {
  28.                 if (rctPositionJoueur.x - 10 > 10)
  29.                 rctPositionJoueur.x = rctPositionJoueur.x - 10;
  30.             }
  31.             if( keystates[ SDLK_DOWN ] ) {
  32.              if (rctPositionJoueur.y + 10 < 650)
  33.                 rctPositionJoueur.y = rctPositionJoueur.y + 10;
  34.             }
  35.             if( keystates[ SDLK_SPACE ] ) {
  36.                     // On crée un missile
  37.                     rctPositionMissile.x = rctPositionJoueur.x;rctPositionMissile.y = rctPositionJoueur.y;
  38.                     int dommage = 10, munition = 100000, vitesse = 10, cadence = 10;
  39.                     Missile* A = new Missile(dommage,munition,vitesse,cadence,"images/TurboLaser.png","TurboLaser.wav" );
  40.                     A->setX(rctPositionMissile.x);A->setY(rctPositionMissile.y);
  41.                     // On le place dans le vecteur d'affichage des missiles
  42.                     vctMissile.ajouterEnTete(A);
  43.                     FSOUND_PlaySound(FSOUND_FREE,sampleMissile);
  44.             }
  45.          
  46.           while(SDL_PollEvent(&event)){
  47.               if ( event.type == SDL_QUIT )
  48.               continuerApplication = 0;
  49.        if ( event.type == SDL_KEYDOWN ){
  50.        if ( event.key.keysym.sym == SDLK_a)
  51.               continuerApplication = 0;
  52.                  }
  53.               }       
  54.          }


 
Si vous avez des idées sur le problème, ca serait super !!
Si vous avez un peu de temps et que voulez le code entier pour mieux comprendre , je peux l'envoyer par mail.
 
Merci beaucoup

Reply

Marsh Posté le 07-12-2006 à 19:04:52   

Reply

Marsh Posté le 07-12-2006 à 19:57:08    

Yop!
 
je comprends pas tout
quelle est la ligne qui plante avec l'itérateur???
 
void AfficheVectMissile( Vecteur<Missile* > M )
tu n'utilises pas std::vector ? Quelle est cette classe Vecteur?
 
 
void AfficheMissile(Missile objet )
et pourquoi tu fais pas une méthode afficher() à ton objet Missile?
après tu peux faire un  
 
for_each(vctMissile.begin(),
               vctMissile.end(),
               mem_fun(&Missile::afficher));
 
 
 
question subsidiaire:
tu fais l'affichage avant de gérer les actions du joueur.
perso je fais tjs l'inverse mais je ne sais pas vraiment pourquoi. T'as une bonne raison? Parce que si oui, je changerai ;)
 
               


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 07-12-2006 à 20:33:15    

Voila le code correspondant a la classe Vecteur
La ligne qui marche pas , c est ca : vector<T>::iterator _ptr; .
pk ?!
 

Code :
  1. // T pourra etre un missile, un ennemi, un bonus ou une planète
  2. template <class T>
  3. class Vecteur {
  4.       private:
  5.               //Attributs
  6.               int _indice;//indice de la case ou pointe l'iterator
  7.               vector<T> _vect; //vector contenant des objets de classe T             
  8.               //vector<T>::iterator _ptr; //Pointeur de type iterator sur un élément du vecteur
  9.       public:
  10.       // Constructeurs et destructeur
  11.           Vecteur(){_indice = 0;}
  12.               ~Vecteur(){_vect.clear();}
  13.               // Accesseurs (locaux et globaux)
  14.           T getCase( int val ){return _vect[val];}
  15.           T get(){return _vect[_indice];}
  16.               int getIndice(void){return _indice;}
  17.               int getTaille(){return _vect.size();}
  18.               // Fonctions d'usage
  19.               void ajouterEnTete( const T& _newVal ){_vect.insert( _vect.begin(), _newVal );}
  20.               void ajouterEnQueue( const T& _newVal ){_vect.insert( _vect.end(), _newVal );}
  21.               void moveNext(){_indice++;}
  22.               void moveFirst(){_indice = 1;}
  23.               void moveLast(){_indice = _vect.size();}
  24.              // ATTENTION MODIF !!
  25.                
  26.                 //!Efface la case pointée par _ptr
  27.              void remove(){ _vect.pop_back();}
  28.          //!Si un objet du vecteur est sortie de l'ecran par le haut alors la case est effacée
  29.               void SortiEcranHaut(){
  30.         moveFirst();
  31.             for ( int i = 0; i < getTaille(); i++ )
  32.          {
  33.        if ( get()->getY() < 10 )
  34.        {
  35.         delete getCase( i );  
  36.         remove();
  37.            }
  38.            moveNext();
  39.            }
  40.             }
  41.              //!Si un objet du vecteur est sortie de l'ecran par le bas alors la case est effacée.
  42.              void SortiEcranBas(){
  43.               moveFirst();
  44.               for ( int i = 0; i < getTaille(); i++ )
  45.               {
  46.                if ( get()->getY() > 650 )
  47.                {
  48.                 delete getCase( i );  
  49.                 remove();
  50.                }
  51.                moveNext();
  52.               }
  53.              }
  54.           int vide(){        //!Teste si le vecteur est vide
  55.            if ( _vect.empty() )
  56.             return 1;
  57.                   else
  58.                       return 0;
  59.               }
  60. };


 
Concernant la methode afficher à ma classe missile, c'est ce que je comptais faire mais dans tout les cas, ca ne résoud pas mon problème..
pourquoi dans certains cas ca plante ? (alors que je ne change rien au code ?!)
 
Merci.

Reply

Marsh Posté le 07-12-2006 à 20:34:37    

Pour la question subsidiaire, non je n'ai pas de raison de faire ca, j'aurais pu faire l'inverse..

Reply

Marsh Posté le 07-12-2006 à 20:53:50    

Je dis peut-être une connerie, mais comment veux-tu que le compilateur détermine un itérateur sur un vector<T> si tu n'as pas heuuuu... spécialisé vector<T> ?

Reply

Marsh Posté le 07-12-2006 à 20:55:41    

pour ton itérator je ne sais plus, ça fait longtemps que je n'ai pas créé de classe générique
ça a l'air correct, mais j'ai le souvenir d'avoir eu plein de merdes ac ca...
 
Donc je pense que tu devrais utiliser std::vector directement dans ton prog et supprimer cette classe Vecteur
D'après ce que je comprends elle ne sert qu'a stocker le vector et à vérifier si le missile ne sort pas de l'écran.
 
A mon avis, c'est dans la classe Missile que tu dois tester ca:
 

Code :
  1. main ()
  2. {
  3.       vector<Missile*> v;
  4.      ...
  5.    
  6.      vector<Missile*>::iterator i=v.begin();
  7.      for (; i!=v.end(); i++)
  8.           if( (*i)->sortEcran() )
  9.          {
  10.                  delete *i;
  11.                  i=v.erase(i);
  12.           }
  13.       for_each(v.begin(),
  14.                      v.end(),
  15.                      mem_fun(&Missile::afficher));  //ou  alors rajouter afficher dans la boucle d'avant
  16. }


 
pour ajouter en tête ou en queue, tu as push_front et push_back qui ne prennent qu'un argument: ce que tu veux ajouter.
 
 
 
 
 
Mais cela ne marche pas, lorsque je clique sur espace, un coup ca marche , un coup ca plante ?!  
 
c'est à dire?? l'affichage, la création du Missile???
rajoute des cout dans ton code, isole ce qui ne marche pas et dis le moi
 
 
 
 


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 08-12-2006 à 13:08:29    

Il me semble qu'il suffite de faire un

Code :
  1. typename vector<T>::iterator _ptr;

pour que tout aille bien.
Désolé mais je n'ai pas vraiment le temps de regarder plus en détail le reste du code..

Reply

Marsh Posté le 08-12-2006 à 14:12:16    

non, ce sont deux types distincts, rien n'oblige à ce que vector<T>::iterator soit un type pointeur.

Reply

Marsh Posté le 10-12-2006 à 13:16:19    

Désolé de reposter que maintenant..
J'ai un peu avancé : j'ai utilisé std::vector directement comme me le recommandé ptitchep.
Je n'ai donc plus de problème avec mon itérateur.
Les missiles s'affichent correctement, par contre un autre problème est apparu : lorsque j'affiche plusieurs images à l'écran, le jeu ralentit énormément ( à partir de 7-8 images ). Rien que lorsque j'envoie des missiles je suis obligé de leur mettre une vitesse assez importantes pour pas qu'il y en est 8 d'affiché en meme temps à l'écran sinon ca rame..alors je vous laisse imaginé lorsqu'il y a en meme temps des ennemis !!
D' ou pourrait venir ce problème ?
Si vous voulez que je post une partie de mon code pour vous donner une idée du problème dites moi quelle partie.
Merci beaucoup

Reply

Marsh Posté le 10-12-2006 à 14:29:55    

Problème réglé, je rechargais l'image à chaque affichage c'est pour ca !!
merci.

Reply

Marsh Posté le 10-12-2006 à 14:29:55   

Reply

Marsh Posté le 10-12-2006 à 16:19:22    

tout le plaisir est pour moi

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed