Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Un jeu de tir : probleme constructeur

    10 juillet 2007 à 15:04:35

    Bonjour ,
    je fais un jeu de tir en C++ avec la SDL , pour l'instant j'ai le noyeau de mon programme , mais lorsque je compile le compilateur me met :

    Citation : compilateur

    29 C:\Dev-Cpp\mes projets\ballistique\main.cpp expected `;' before "player_un
    30 C:\Dev-Cpp\mes projets\ballistique\main.cpp expected `;' before "player_deux"



    Un message d'erreur que je suis habitué a voir et qui habituellement se resoud facilement , mais la je ne vois vraiement pas l'erreure , si quelqu'un se sent le courage de jeter un coup d'oeil a mon code source.

    main.cpp:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <SDL/SDL.h>


    #include "tir.hpp"
    #include "terrain.hpp"
    #include "joueur.hpp"
    #include "constantes.hpp"

    using namespace std;



    int main(int argc,char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        int compteur = 0,continuer=1;
        int joueur = PLAYER1;
        SDL_Surface *ecran = NULL;
        ecran = SDL_SetVideoMode(600, 600, 32, SDL_HWSURFACE);
        SDL_Event event;
        terrain terrain_un(ecran);
        tir tir_PLAYER1;
        tir tir_PLAYER2;
        joueur player_un();
        joueur player_deux();
        while(continuer)
        {
        SDL_Flip(ecran);
        SDL_WaitEvent(&event);
        switch(event.type)
        {
                /*      pour l'intant je n'ai pas touche a la gestion de evenements et l'entree de la puissance , angle,gravitee de la part des joueurs... */
                          default :
                              if(joueur == PLAYER1)
                              {
                              compteur = tir_PLAYER1.tirer(25,0,-150,1);
                                 if(compteur == 1)
                                 {   joueur = PLAYER2;}
                              }
                               if(joueur == PLAYER2)
                              {
                              compteur = tir_PLAYER2.tirer(25,0,-150,1);
                                 if(compteur == 1)
                                   {  joueur = PLAYER1; }
                              }
        }   //switch
        }   //while
        return 0;
    }


    tir.cpp:



    #include <iostream>
    #include <math.h>
    #include <SDL/SDL.h>

    #include "tir.hpp"
    #include "constantes.hpp"

    int tir::tirer(double force,double vent,double angle,double gravitee) : wforce(force),wvent(vent),wangle(angle),wgravitee(gravitee)
          {
             positionFond.x=0;
             positionFond.y=0;
             ecran = SDL_SetVideoMode(600, 600, 32, SDL_HWSURFACE);
             fond = SDL_LoadBMP("map.bmp");
             balle = SDL_LoadBMP("balle.bmp");
             positionBalle.x = 0;
             positionBalle.y = 600;
             wincrementationX = force * cos(angle);
             wincrementationY = force * sin(angle);
             wContinuer = 1;
             SDL_SetColorKey(balle, SDL_SRCCOLORKEY, SDL_MapRGB(balle->format, 255, 255, 255));
             while(wContinuer)
             {
                positionBalle.x += wincrementationX;
                positionBalle.y -= wincrementationY;   
                wincrementationY -= wgravitee;
                wincrementationX += wvent; 
                if((positionBalle.x+30>=0)&&(positionBalle.x +30<=60))
                        abssices = 0;
                if((positionBalle.x+30>=60)&&(positionBalle.x+30<=120))
                        abssices = 1;
                if((positionBalle.x+30>=120)&&(positionBalle.x+30<=180))
                        abssices = 2;
                if((positionBalle.x+ 30>=180)&&(positionBalle.x+ 30<=240))
                        abssices = 3;
                if((positionBalle.x+ 30>=240)&&(positionBalle.x+30<=300))
                        abssices = 4;
                if((positionBalle.x+ 30>=300)&&(positionBalle.x+ 30<=360))
                        abssices = 5;
                if((positionBalle.x+ 30>=360)&&(positionBalle.x+30<=420))
                        abssices = 6;
                if((positionBalle.x+ 30>=420)&&(positionBalle.x+ 30<=480))
                        abssices = 7;
                if((positionBalle.x+30>=480)&&(positionBalle.x+30<=540))
                        abssices = 8;
                if((positionBalle.x+30>=540)&&(positionBalle.x+ 30<=600))
                        abssices = 9;
                       
                       
                if((positionBalle.y>=0)&&(positionBalle.y<=60))
                        ordonnees = 0;
                if((positionBalle.y>=60)&&(positionBalle.y<=120))
                        ordonnees = 1;
                if((positionBalle.y>=120)&&(positionBalle.y+30<=180))
                        ordonnees = 2;
                if((positionBalle.y>=180)&&(positionBalle.y<=240))
                        ordonnees = 3;
                if((positionBalle.y>=240)&&(positionBalle.y<=300))
                        ordonnees = 4;
                if((positionBalle.y>=300)&&(positionBalle.y<=360))
                        ordonnees = 5;
                if((positionBalle.y>=360)&&(positionBalle.y<=420))
                        ordonnees = 6;
                if((positionBalle.y>=420)&&(positionBalle.y<=480))
                        ordonnees = 7;
                if((positionBalle.y>=480)&&(positionBalle.y<=540))
                        ordonnees = 8;
                if((positionBalle.y>=540)&&(positionBalle.y<=600))
                        ordonnees = 9;
                     
                           
                     
                SDL_BlitSurface(fond,NULL,ecran,&positionFond);   
                SDL_BlitSurface(balle,NULL,ecran,&positionBalle);
                SDL_Flip(ecran);
                if(terrain_Virtuel[abssices][ordonnees] == TERRE)
                {
                     return 1
                }
                if(terrain_Virtuel[abssices][ordonnees] == BONUS)
                {
                     return 2
                } 
                if(terrain_Virtuel[abssices][ordonnees] == HERBE)
                {
                     return 3
                }   
             }
      }
     


    tir.hpp:

    #include <SDL/SDL.h>


    class tir
    {

          public:
          int tirer(double force,double vent,double angle,double gravitee);
         
          private:
          bool wContinuer;
          double wforce;
          double wangle;
          double wgravitee;
          double wincrementationX;
          double wincrementationY;
          double wvent;
          int ordonnees , abssices;
          SDL_Surface *balle,*ecran,*fond;
          SDL_Rect positionBalle,positionFond;
    };
     


    terrain.cpp

    #include <iostream>
    #include <stdio.h>
    #include <SDL/SDL.h>


    #include "terrain.hpp"
    #include "constantes.hpp"


    terrain::terrain(SDL_Surface*ecran)
    {
         positionBloc.x = 0;
         positionBloc.y = 0;
         int caractere = 0;
         ciel = SDL_LoadBMP("ciel.bmp");
         terre = SDL_LoadBMP("terre.bmp");
         FILE*terrain = NULL;
         terrain = fopen("terrain1.txt","r");
         while(caractere != EOF)
         {
          caractere = fgetc(terrain);
          if(caractere=='\n')
           {
                positionBloc.y += LARGEUR;
                positionBloc.x = 0;
           }
          if(caractere=='a')
          {
                terrain_Virtuel[(positionBloc.x/60)][(positionBloc.y/60)] = CIEL;
                SDL_BlitSurface(ciel,NULL,ecran,&positionBloc);
                positionBloc.x += LONGUEUR;
          }
          if(caractere=='b')
          {
                terrain_Virtuel[(positionBloc.x/60)][(positionBloc.y/60)] = TERRE;
                SDL_BlitSurface(terre,NULL,ecran,&positionBloc);
                positionBloc.x += LONGUEUR;
          }
          }
      SDL_SaveBMP(ecran,"map.bmp");
    }
     


    terrain.hpp

    class terrain
    {

          public:
          terrain(SDL_Surface*);
          ~terrain(){};
          private:
          SDL_Surface *ciel,*terre;
          SDL_Rect positionBloc;
    };

     


    constante.hpp :


    /*variable globale : celle ci genere aussi une erreure , le compilateur me dit qu'il y a une definition multiple de cette variable */
    int terrain_Virtuel[10][10];


    #define LONGUEUR         60
    #define LARGEUR          60
    #define NBBLOCS_LARGEUR  10
    #define NBBLOCS_LONGUEUR 10
    #define CIEL             1
    #define TERRE            2
    #define BLANC            0
    #define PLAYER1          100
    #define PLAYER2          200
     


    joueur.hpp
    class joueur
    {
          public:
              joueur();
              int ajouter_points(int point);
             
          private:
              int wPoint;
    };
     


    joueur.cpp
    #include "joueur.hpp"

    joueur::joueur()
    {
                    wPoint = 0;
    }
    int joueur::ajouter_points(int point)
    {
        wPoint+=point;
        return wPoint;
    }
     


    Mon jeu de tir va consister en fait a tirer sur l'autre joueur en entrant la gravitee , l'angle ,la force du tir,le vent sera genere aléatoirement .Si vous tirez dans la terre c'est a l'autre joueur de jouer ,si vous tirez dans bonus : vous avez un bonus je n'ai pas decider que ferait ce bonus ,si vous tirez dans de l'herbe vous avez un point en moins.Bien sur s vous tirez dans votre enneùmi vous gagnez un point.
    • Partager sur Facebook
    • Partager sur Twitter
      10 juillet 2007 à 15:53:12

      Tu n'as pas besoin de mettre de () pour appeler le constructeur par défaut


      joueur player_1;
       


      suffit. Mais je ne sais pas si c'est ça l'erreur.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        10 juillet 2007 à 16:09:48

        Non ça vient pas de la , j'avais déjà essayé.
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2007 à 17:21:07

          Remarque tout a fait à part, bien que l'extension des fichier source C++ soit .cpp, l'extension pour les header reste .h, habituellement. Le .hpp est en général reservé aux headers qui contiennent du code executable: la plupart du temps des fonctions et classes template, ainsi que les membres inlines.

          Edit: Les variables globales sont à PROSCRIRE! Essaye de trouver un autre moyen, si tu ne peux vraiment pas t'en passer. Sinon, le problème des declaration multiples, lors de l'edition des lien, vient tout simplement du fait que ta variable globale, comme elle est declarée dans un .h, son symbole correspondant après la compilation se trouve dans plusieurs fichiers objet. Solution, la declarer dans le .cpp, et la déclarer comme extern dans tous les autres fichiers dans lesquel tu as besoin d'y acceder.
          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2007 à 19:27:40

            Ok je vais esayer de trouver un moyen pour ne pas utiliser les variables globales , mais pour l'erreure du ; devant joueur1 et joueur 2 je vois vraiment pas ce que c'est :

            Citation : compilateur DEV C++

            37 C:\Dev-Cpp\mes projets\ballistique\main.cpp expected `;' before "joueur_un"
            38 C:\Dev-Cpp\mes projets\ballistique\main.cpp expected `;' before "joueur_deux"

            • Partager sur Facebook
            • Partager sur Twitter
              11 juillet 2007 à 18:34:31

              Salut Gottfried ;) ,

              As-tu essayé de mettre un constructeur par défaut pour ta clase tir (même si tu le laisse vide)? Je ne sais pas si ça va changer quoique ce soit, mais j'avais remarqué que tu n'en avais pas mis, et ça peux peut être aider :-° ?

              Bonne chance en tout cas ;) .
              • Partager sur Facebook
              • Partager sur Twitter
                11 juillet 2007 à 19:20:51

                Merci mais le probleme s'est reglé tout seul sans que je ne comprennes pourquoi :

                j'ai seulement deplacé les declaration :

                joueur joueur_un;
                joueur joueur_deux;


                je les ai mis tout au debut du main et c a marche...
                • Partager sur Facebook
                • Partager sur Twitter
                  11 juillet 2007 à 19:42:03

                  Normal... joueur signifie 2 choses dans ton main : une classe et une variable de type int, lors que le compilo résout joueur avant la déclaration du int il trouve la classe après il trouve... le int!

                  Pour éviter ce genre d'erreur tu peux adopter une convention d'écriture comme le nom des classes commencent par une majuscule

                  class Joueur
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juillet 2007 à 20:15:57

                    ah oui j'avais pas remarqué que j'avais une aute variable joueur
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL]Un jeu de tir : probleme constructeur

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown