IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Projet pong : Erreurs de compilation


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut Projet pong : Erreurs de compilation
    Bonjour, ou plutôt bonsoir à tous !

    Je suis actuellement étudiant en DUT informatique (S1) et voilà maintenant quelques semaines que nous sommes sur un projet : Coder en pong en SDL
    J'ai décidé de beaucoup m'aider des tuto présents sur internet qui m'ont permis de faire quelque chose de plutôt sympa (j'ai même pu utiliser des classes, choses qu'on a pas encore appris, mais bon, je suis pas sûr que mon code soit optimal du coup.. j'ai fait au mieux !)
    Ce soir je me suis dit : "Et si je découpais mon code pour mieux m'y retrouver et que ce soit plus pratique ?"
    TATATATA ! mauvaise idée, je me retrouve avec des erreurs de compilation !
    Je suis encore néophyte dans l'informatique (début du S1, autant dire que c'est pas évident quand de base on n'y connait pas grand chose...)
    Mes erreurs de compilation :

    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|10|multiple definition of `ball'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|10|multiple definition of `background'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|12|multiple definition of `screen'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|12|multiple definition of `raquetteGauche'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|15|multiple definition of `raquetteDroite'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|18|multiple definition of `event'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs'
    C:\Users\Anthony\Desktop\Projet-pong\pong.cc|21|multiple definition of `font'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\Projet-pong\main.cpp|12|first defined here|

    Voilà, je vous copie maintenant mes fichiers :

    le header (Pong.h)
    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
     
    #include"SDL/SDL.h"
    #include"SDL/SDL_image.h"
    #include"SDL/SDL_ttf.h"
    #include<string>
    #include<stdio.h>
    #include<math.h>
     
     
    //Les attributs de l'écran
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 475;
    const int SCREEN_BPP = 32;
     
    //La Frame rate
    const int FRAMES_PER_SECOND = 20;
     
    //Les dimensions de la balle
    const int BALL_WIDTH = 35;
    const int BALL_HEIGHT = 35;
     
    //Les dimensions des raquettes
    const int RAQUETTE_WIDTH = 15;
    const int RAQUETTE_HEIGHT = 85;
     
    // pour ttfont
     
    int fontSize=36;
    int pointsJoueur1=10;
     
    //Les surfaces
    SDL_Surface *ball = NULL;
    SDL_Surface *background = NULL;
    SDL_Surface *screen = NULL;
    SDL_Surface *raquetteGauche = NULL;
    SDL_Surface *raquetteDroite = NULL;
     
    //Structure évènement
    SDL_Event event;
     
    //la police
    TTF_Font *font = NULL;
     
    //la couleur de la police
    SDL_Color textColor = { 255, 255, 255 };
    //score
     
     
     
    //la raquette à gauche
    class RaquetteGauche
    {
        private:
            //La zone de collision pour la raquette à gauche
     
     
            //La vitesse de déplacement de la raquette à gauche
            int xVel, yVel;
     
        public:
            //On initialise les variables pour la raquette à gauche
            RaquetteGauche();
            SDL_Rect boxL;
            //ça prend en compte la touche pressée et ajuste la vitesse de la balle
            void handle_input();
     
            //mouvement de la raquette à gauche
            void move();
     
            //affiche la raquette gauche à l'écran
            void show();
    };
     
    //Raquette de droite
    class RaquetteDroite
    {
        private:
     
            //La vitesse de déplacement de la raquette à droite
            int xVel, yVel;
     
        public:
     
            //On initialise les variables pour la raquette de droite
            RaquetteDroite();
            SDL_Rect boxR;
            //ça prend en compte la touche pressée et ajuste la vitesse de la balle
            void handle_input();
     
            //Mouvement de la raquette de droite
            void move();
     
            //affiche la raquette droite à l'écran
            void show();
    };
     
    //La balle
    class Ball
    {
        public:
            //Initialisation des variables
            Ball();
            SDL_Rect collbox;
            int xVel, yVel;
     
            //réinitialise la balle au centre de l'écran
            void reset();
     
            //prend en compte les touches préssées et ajuste la vitesse de la balle
            void handle_input();
     
            //Mouvement de la balle
            void move();
     
            //affiche la balle à l'écran
            void show();
    };
     
    //Le timer
    class Timer
    {
        private:
            //Le timer commence
            int startTicks;
     
            //Stockage quand on met le jeu en pause
            int pausedTicks;
     
            //L'état du timer
            bool paused;
            bool started;
     
        public:
            //On initialise les variables
            Timer();
     
            //Les différentes actions du timer
            void start();
            void stop();
            void pause();
            void unpause();
     
            //Donne le temps du timer
            int get_ticks();
     
            //Vérification de l'état du timer
            bool is_started();
            bool is_paused();
    };
     
     
    SDL_Surface *load_image( std::string filename );
    void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL);
    bool check_collision( SDL_Rect A, SDL_Rect B);
    bool init();
    bool load_files();
    void clean_up();
    Le main :

    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
     
    #include"SDL/SDL.h"
    #include"SDL/SDL_image.h"
    #include"SDL/SDL_ttf.h"
    #include<string>
    #include<stdio.h>
    #include<math.h>
    #include "Pong.h"
     
     
    int main( int argc, char* args[] )
    {
        //On définie la surface pour le message quand on gagne.
        SDL_Surface *message = NULL;
     
        //Quitter
        bool quit = false;
     
        //La balle que l'on va utiliser
        Ball myBall;
     
        //Les raquettes
        RaquetteGauche raquetteGauche;
        RaquetteDroite raquetteDroite;
     
        //le régulateur de frame rate par secondes
        Timer fps;
     
        //Initialisation
        if(init() == false)
        {
            return 1;
        }
     
        //chargement des fichiers
        if(load_files() == false)
        {
            return 1;
        }
     
     
     
        //tq l'utilisateur n'a pas quitté
        while( quit == false )
        {
            //On démarre le compteur de fps
            fps.start();
     
            //tq il y a des evenements à gérer
            while( SDL_PollEvent(&event) )
            {
                //les évènements de la balle
                myBall.handle_input();
     
                //Les évènements de la raquette
                raquetteGauche.handle_input();
                raquetteDroite.handle_input();
     
                //si on ferme la fenetre
                if (event.type == SDL_QUIT)
                {
                    //quitte le jeu
                    quit = true;
                }
            }
     
            //Mouvement de la balle
            myBall.move();
     
            //Si la balle tape la raquette de gauche
            if(check_collision(myBall.collbox, raquetteGauche.boxL) == true )
            {
                //la balle "rebondit", on utilise un rand pour éviter que la trajectoire de la balle soit toujours la même et que le jeu se ferme en une boucle infinie
                myBall.xVel = rand()%30+15;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Si la balle frappe la raquette de droite
            if((check_collision(myBall.collbox, raquetteDroite.boxR) == true) )
            {
                //la balle rebondit, même remarque, on utilise un rand.
                myBall.xVel = (rand()%30+15)*-1;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Mouvement des raquettes
            raquetteGauche.move();
            raquetteDroite.move();
     
            //On définit le background
            apply_surface(0, 0, background, screen);
     
            //Affichage de la balle sur l'écran
            myBall.show();
     
            //Si la balle sort du coté gauche de l'écran
            if( (myBall.collbox.x + BALL_WIDTH) < 0)
            {
                //On affiche un message : LES BLEUS ONT GAGNE
                message = TTF_RenderText_Solid(font, "Victoire des bleus !", textColor);
     
                //Si un message doit s'afficher
                if( message != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On place le message au centre de l'écran
                    apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );
     
                    //le message est ensuite effacé
                    message = NULL;
                }
     
                //Si on presse la touche espace, la balle est "reset"
                if( event.key.keysym.sym == SDLK_SPACE )
                {
                    myBall.reset();
                }
            }
     
            //Si la balle sort du coté droit de l'écran
            if( myBall.collbox.x > SCREEN_WIDTH)
            {
                //On affiche à l'écran "les rouges ont gagné !
                message = TTF_RenderText_Solid(font, "Victoire des rouges !", textColor);
     
                //Si un message doit s'afficher
                if( message != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On centre le message à l'écran
                    apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );
     
                    //On retire l'affichage du message
                    message = NULL;
                }
     
                //Si on presse la touche espace, la balle est reset
                if( event.key.keysym.sym == SDLK_SPACE )
                {
                    myBall.reset();
                }
            }
     
            //Affiche les raquettes à l'écran
            raquetteGauche.show();
            raquetteDroite.show();
     
     
            if( SDL_Flip( screen ) == -1 )
            {
                return 1;
            }
     
            //on définie un plafond pour le frame rate.
            if(fps.get_ticks() < 1000 / FRAMES_PER_SECOND)
            {
                SDL_Delay( (1000/ FRAMES_PER_SECOND) - fps.get_ticks() );
            }
        }
     
        clean_up();
     
        return 0;
    }

    Le pong.cc :
    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
     
    #include"SDL/SDL.h"
    #include"SDL/SDL_image.h"
    #include"SDL/SDL_ttf.h"
    #include<string>
    #include<stdio.h>
    #include<math.h>
    #include "Pong.h"
     
    SDL_Surface *load_image( std::string filename )
    {
        //image chargée
        SDL_Surface* loadedImage = NULL;
     
        //la surface qui va être utilisée par l'image
        SDL_Surface* optimizedImage = NULL;
     
        // image chargée
        loadedImage = IMG_Load(filename.c_str());
     
        //Si l'image est chargée
        if(loadedImage != NULL)
        {
            //on créé une surface optimale pour cette image
            optimizedImage = SDL_DisplayFormat(loadedImage);
     
            //On libère la surface
            SDL_FreeSurface(loadedImage);
     
            //Si l'image est optimisée
            if(optimizedImage != NULL)
            {
                //
                Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 255, 255, 255);
     
                //On définie que tous les pixels blancs doivent être transparants.
                SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
            }
        }
     
        //On retourne la surface optimisée
        return optimizedImage;
    }
     
    void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip /*= NULL*/)
    {
     
        SDL_Rect offset;
     
        //Variables de offset
        offset.x = x;
        offset.y = y;
     
     
        SDL_BlitSurface(source, clip, destination, &offset);
    }
     
    bool check_collision( SDL_Rect A, SDL_Rect B)
    {
        //Les cotés des rectangles
        int leftA, leftB;
        int rightA, rightB;
        int topA, topB;
        int bottomA, bottomB;
     
        //Calcule la posuition des cotés de A et de B
        leftA = A.x;
        rightA = A.x + A.w;
        topA = A.y;
        bottomA = A.y + A.h;
     
        leftB = B.x;
        rightB = B.x + B.w;
        topB = B.y;
        bottomB = B.y + B.h;
     
        //Si l'un des cotés de A est à l'exterieur de B
        if( bottomA <= topB)
        {
            return false;
        }
     
        if( topA >= bottomB )
        {
            return false;
        }
     
        if( rightA<=leftB)
        {
            return false;
        }
     
        if( leftA>=rightB)
        {
            return false;
        }
     
        //Si aucun des cotés de A n'est à l'exterieur de B
        return true;
    }
     
    bool init()
    {
        //On initialise la SDL
        if(SDL_Init( SDL_INIT_EVERYTHING ) == -1)
        {
            return false;
        }
        screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
     
        //S'il y a eu une erreur pendant le chargement de l'écran
        if(screen == NULL)
        {
            return false;
        }
     
        if( TTF_Init() == -1 )
        {
            return false;
        }
     
     
        SDL_WM_SetCaption("Move the Ball", NULL);
     
     
        return true;
    }
     
    bool load_files()
    {
        //Chargement des images
        ball = load_image("tennisBall.bmp");
        background = load_image("fond.jpg");
        raquetteGauche = load_image("RaquetteRouge.bmp");
        raquetteDroite = load_image("RaquetteBleue.bmp");
     
     
        font = TTF_OpenFont("ASMAN.ttf",65);
     
        //Si erreur de chargement des images
        if(font == NULL)
        {
            return false;
        }
     
        //Si la balle ne s'est pas chargée correctement
        if(ball == NULL)
        {
            return false;
        }
     
        //Si le fond de jeu ne s'est pas bien chargé
        if(background == NULL)
        {
            return false;
        }
     
        //Si les raquettes ne se sont pas bien chargées
        if(raquetteGauche == NULL || raquetteDroite == NULL)
        {
            return false;
        }
     
        //Si tout s'est chargé correctement
        return true;
    }
     
    void clean_up()
    {
        //On libère la surface
        SDL_FreeSurface(ball);
        SDL_FreeSurface(background);
        SDL_FreeSurface(raquetteGauche);
        SDL_FreeSurface(raquetteDroite);
        TTF_CloseFont(font);
        TTF_Quit();
        SDL_Quit();
    }
     
    RaquetteGauche::RaquetteGauche()
    {
     
        boxL.x = 0;
        boxL.y = SCREEN_HEIGHT/2 - RAQUETTE_HEIGHT/2;
     
        //On définie la zone de collision
        boxL.w = RAQUETTE_WIDTH;
        boxL.h = RAQUETTE_HEIGHT;
     
        //on définie la vitesse de la raquette gauche
        xVel = 0;
        yVel = 0;
    }
     
    RaquetteDroite::RaquetteDroite()
    {
     
        boxR.x = 625;
        boxR.y = SCREEN_HEIGHT/2 - RAQUETTE_HEIGHT/2;
     
        //On définie la zone de collision
        boxR.w = RAQUETTE_WIDTH;
        boxR.h = RAQUETTE_HEIGHT;
     
        //On définie la vitesse de la raquette droite
        xVel = 0;
        yVel = 0;
    }
     
    void RaquetteGauche::handle_input()
    {
        //Si une touche est pressée
        if( event.type == SDL_KEYDOWN )
        {
            //On ajuste la vitesse de la raquette
            switch( event.key.keysym.sym )
            {
                case SDLK_a: yVel -= RAQUETTE_HEIGHT/9; break;
                case SDLK_z: yVel += RAQUETTE_HEIGHT/9; break;
            }
        }
        //Si la touche n'est pas pressée
        else if( event.type == SDL_KEYUP )
        {
            //On ajuste la vitesse
            switch( event.key.keysym.sym )
            {
                case SDLK_a: yVel += RAQUETTE_HEIGHT/9; break;
                case SDLK_z: yVel -= RAQUETTE_HEIGHT/9; break;
            }
        }
    }
     
    void RaquetteDroite::handle_input()
    {
        //Si une touche à été pressée
        if( event.type == SDL_KEYDOWN )
        {
            //On modifie la vitesse de la raquette
            switch( event.key.keysym.sym )
            {
                case SDLK_UP: yVel -= RAQUETTE_HEIGHT/9; break;
                case SDLK_DOWN: yVel += RAQUETTE_HEIGHT/9; break;
            }
        }
        //si une touche à été lachée
        else if( event.type == SDL_KEYUP )
        {
            //On modifie la vitese de la raquette
            switch( event.key.keysym.sym )
            {
                case SDLK_UP: yVel += RAQUETTE_HEIGHT/9; break;
                case SDLK_DOWN: yVel -= RAQUETTE_HEIGHT/9; break;
            }
        }
    }
     
    void RaquetteGauche::move()
    {
        //Mouvement de la raquette de haut en bas et de bas en haut
        boxL.y += 4*yVel;
     
        //Si la raquette va trop en bas ou trop en haut
        if( (boxL.y<0) || (boxL.y + RAQUETTE_HEIGHT > SCREEN_HEIGHT) )
        {
            //mouvement de retour
            boxL.y -= 4*yVel;
        }
    }
     
    void RaquetteDroite::move()
    {
        //Mouvement de la raquette haut/bas bas/haut
        boxR.y += 4*yVel;
     
        //Si la raquette va trop en bas ou trop en haut
        if( (boxR.y<0) || (boxR.y + RAQUETTE_HEIGHT > SCREEN_HEIGHT) )
        {
            //mouvement de retour
            boxR.y -= 4*yVel;
        }
    }
     
    void RaquetteGauche::show()
    {
        //Affiche la raquette gauche
        apply_surface(boxL.x, boxL.y, raquetteGauche, screen);
    }
     
    void RaquetteDroite::show()
    {
        //Affiche la raquette droite
        apply_surface(boxR.x, boxR.y, raquetteDroite, screen);
    }
     
    Ball::Ball()
    {
        //On initialise le décalage
        collbox.x = SCREEN_WIDTH/2 - BALL_WIDTH/2;
        collbox.y = SCREEN_HEIGHT/2 - BALL_HEIGHT/2;
     
        //on définie la zone de collision
        collbox.w = BALL_WIDTH - 5;
        collbox.h = BALL_HEIGHT - 5;
     
        //On initialise les variables de vitesse
        xVel = 0;
        yVel = 0;
    }
     
    void Ball::reset()
    {
        //remet à 0 le décalage
        collbox.x = SCREEN_WIDTH/2 - BALL_WIDTH/2;
        collbox.y = SCREEN_HEIGHT/2 - BALL_HEIGHT/2;
     
        //remet à 0 la vitesse de la balle
        xVel = 0;
        yVel = 0;
    }
     
    void Ball::handle_input()
    {
        int lORr; //Cette variable va servir à savoir si, au départ du jeu, après avoir préssé la touche espace, la balle part du coté gauche ou du coté droit
     
        //si une touche est pressée
        if( event.type == SDL_KEYDOWN )
        {
            //On assigne une vitesse "random"
            if( event.key.keysym.sym == SDLK_SPACE )
            {
                lORr = rand()%2;
                if(lORr == 0){
                    xVel = rand()%5+10;
                    yVel = rand()%15;
                }
                if(lORr == 1){
                    xVel = (rand()%5+10*-1);
                    yVel = (rand()%15)*-1;
                }
            }
        }
    }
     
    void Ball::move()
    {
        //bouge la balle à droit ou à gauche
        collbox.x += xVel;
     
        //bouge la droite en haut ou en bas
        collbox.y += yVel;
     
        //Si la balle va trop en haut ou trop en bas, collision.
        if( (collbox.y<0) || (collbox.y + BALL_HEIGHT > SCREEN_HEIGHT) )
        {
            //la balle revient, retour.
            yVel = -1*yVel;
        }
    }
     
    void Ball::show()
    {
        //On affiche la balle
        apply_surface(collbox.x, collbox.y, ball, screen);
    }
     
    Timer::Timer()
    {
        //On initialise les variable de timer
        startTicks = 0;
        pausedTicks = 0;
        paused = false;
        started = false;
    }
     
    void Timer::start()
    {
        //Début du timer
        started = true;
     
        //On sort de "pause"
        paused = false;
     
        //Donne le temps du timer
        startTicks = SDL_GetTicks();
    }
     
    void Timer::stop()
    {
        //On arrête le timer
        started = false;
     
        //On sort du "pause" du timer
        paused = false;
    }
     
    void Timer::pause()
    {
        //Si le timer n'est pas en pause
        if( (started == true) && (paused == false) )
        {
            //menu pause
            paused == true;
     
     
            pausedTicks = SDL_GetTicks() - startTicks;
        }
    }
     
    void Timer::unpause()
    {
        //si le timer est en pause
        if(paused == true)
        {
            //sort de pause
            paused = false;
            startTicks = SDL_GetTicks() - pausedTicks;
            pausedTicks = 0;
        }
    }
     
    int Timer::get_ticks()
    {
        //Le timer est en marche
        if(started == true)
        {
            //Le timer est en pause
            if(paused == true)
            {
     
                return pausedTicks;
            }
            else
            {
                //Retourne le temps moins le temps de départ
                return SDL_GetTicks() - startTicks;
            }
        }
     
        //si le timer n'est pas en marche
        return 0;
    }
     
    bool Timer::is_started()
    {
        return started;
    }
     
    bool Timer::is_paused()
    {
        return paused;
    }

    Voilà voilà, j'aurais également d'autres petites questions à poser mais je me contenterais de ça pour le moment !

    Je vous remercie d'avoir eu la patience de me lire et peut-être de m'aider
    Bonne journée/soirée

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Histoire de tout faire d'un coup, je vais également poser les autres questions :
    - J'ai pleins de warning qui s'affichent, je sais sais que c'est en rapport avec les touches pressée, mais je ne sais pas trop quoi faire, en gros ils énumèrent les touches non pressées du coup c'est ultra long à compiler.. (930 warnings !)
    - Pourriez vous m'aiguiller sur la marche à suivre pour ajouter le score et le menu ?

    VOilà voilà, une fois cela fait, j'aurais enfin terminé mon pong !
    Je vous remercie et vous souhaite une bonne journée

  3. #3
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Bonjour,

    pour le "multiple definition", ça a l'air de venir de ton fichier header (pong.h), qui doit s'écrire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #IFNDEF _PONG 
    #DEFINE _PONG 
     
    // ton code ici
     
    #ENDIF
    afin d'éviter de l'inclure plusieurs fois.

    Pour les warnings, ça vient de tes switch.
    Ajoute un "default" après tes "case", ou remplace le switch par des if.

    Pour le score et le menu, à toi d'y réfléchir .

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Tout d'abord merci d'avoir eu la gentillesse de me répondre
    Je n'ai pas mon code sous la main, je vais voir ça d'ici 1 petite heure.
    Concernant le score, j'avais pensé à utiliser la même phrase de font que lorsque j'affiche "victoire des bleues" ou "victoire des rouges" en remplaçant par une variable le message, que j'incrémenterais ensuite. Cependant, ça ne marche pas, il semblerait qu'il soit impossible d'y mettre une variable, y a t-il une autre manière d'afficher un message en pouvant y inclure une variable ?

    EDIT : C'est bon pour les warnings avec les default merci mille fois !

    EDIT : pour le score j'ai cette solution : void vTexte(char *message, short x, short y, char *font_face, short font_size, Uint8 r, Uint8 g, Uint8 b)
    {
    SDL_Color color;
    SDL_Color colorShaded;
    SDL_Surface *text;
    SDL_Rect Rectangle_Destination;

    color.r=r;
    color.g=g;
    color.b=b;

    font=TTF_OpenFont(font_face, font_size);
    if ( ! font)
    {
    fprintf(stderr, " Erreur : impossible de charger la police de caractères font.ttf ( Arial) \n");
    exit(2);
    }
    text = TTF_RenderText_Solid(font, message, color);
    if ( ! text)
    SDL_Quit();

    Rectangle_Destination.x = x;
    Rectangle_Destination.y = y;
    Rectangle_Destination.w = text->w;
    Rectangle_Destination.h = text->h;

    SDL_BlitSurface(text, NULL, Screen, &_Destination);

    SDL_FreeSurface(text);
    TTF_CloseFont(font);
    }

    int main ( int argc, char *argv[])
    {
    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();
    Screen = SDL_SetVideoMode(320,240,16,SDL_HWSURFACE);
    SDL_WM_SetCaption("TILETEST",NULL);
    vTexte("J´aime la tarte aux fraises",0,0,"font.ttf",12,255,255,255);
    SDL_Flip(Screen);
    SDL_Delay(5000);
    SDL_Quit();
    return 0;
    }

    Mais "j'aime les tartes..." ne peut pas être remplacé par une variable....

  5. #5
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Citation Envoyé par anthonynguyen0 Voir le message
    Mais "j'aime les tartes..." ne peut pas être remplacé par une variable....
    Ta fonction vTexte prend en entrée un char*.
    Si ta variable est un nombre, tu dois donc la convertir en char*.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    C'était une question un peu bête effectivement...

    Donc, si je ne suis pas trop bête, je dois faire ceci :
    void vTexte(int score, short x, short y, char *font_face, short font_size, Uint8 r, Uint8 g, Uint8 b)
    {
    SDL_Color color;
    SDL_Color colorShaded;
    SDL_Surface *text;
    SDL_Rect Rectangle_Destination;

    color.r=r;
    color.g=g;
    color.b=b;

    font=TTF_OpenFont(font_face, font_size);
    if ( ! font)
    {
    fprintf(stderr, " Erreur : impossible de charger la police de caractères font.ttf ( Arial) \n");
    exit(2);
    }
    text = TTF_RenderText_Solid(font, score, color);
    if ( ! text)
    SDL_Quit();

    Rectangle_Destination.x = x;
    Rectangle_Destination.y = y;
    Rectangle_Destination.w = text->w;
    Rectangle_Destination.h = text->h;

    SDL_BlitSurface(text, NULL, Screen, &_Destination);

    SDL_FreeSurface(text);
    TTF_CloseFont(font);
    }

    Pour le main, j'avais pensé mettre l'appel à la fonction au début de ma boucle while( quit == false ), cependant, rien n'y fait, rien ne s'affiche...
    J'ai alors pensé que (peut être) mais background se mettait au dessus du texte ? J'ai essayé de faire des affichages simples avec du texte, mais toujours rien... Je nage un peu...

    EDIT : tout fonctionne jusqu'à la ligne TTFRENDER, on doit apparement utiliser un char... Ce qui veut dire que je dois trouver une autre manière d'afficher le message

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Excusez moi je ne la connaissais pas, j'ai modifié mon message

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    J'ai finalement essayé à nouveau la séparation de mon code avec les #define comme vous me l'avez dit, jusque là pas de soucis, sauf que j'ai toujours les même erreurs...
    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
     
    ||=== Build: Debug in Projet-pong (compiler: GNU GCC Compiler) ===|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc||In member function 'void Timer::pause()':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|410|warning: statement has no effect [-Wunused-value]|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|10|multiple definition of `ball'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|10|multiple definition of `background'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|12|multiple definition of `screen'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|12|multiple definition of `raquetteGauche'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|15|multiple definition of `raquetteDroite'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|18|multiple definition of `event'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    obj\Debug\pong.o||In function `Z10load_imageSs':|
    C:\Users\Anthony\Desktop\projet-pong-bloc\pong.cc|21|multiple definition of `font'|
    obj\Debug\main.o:C:\Users\Anthony\Desktop\projet-pong-bloc\main.cpp|16|first defined here|
    ||=== Build failed: 14 error(s), 1 warning(s) (0 minute(s), 2 second(s)) ===|
    j'ai copié si dessus les erreurs que ça me fait.
    Vu ce que j'ai compris, c'est un soucis entre le cc et le cpp, mais je n'en sais pas plus... je comprends pas vraiment pourquoi ça fait ça
    Fondamentalement, ce soucis n'est pas si grave, la séparation du code n'est pas du tout obligatoire pour mon projet, mais j'aurais aimé commencer à le faire pour en prendre l'habitude et aussi pour y voir plus clair. J'ai aussi l'impression que ce sera plus pratique pour implanter un menu...
    Des suggestions ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    re-bonsoir

    J'ai essayé quelque chose pour l'affichage du score :
    Je ne sais pour le moment pas comment l'afficher sur mon écran de jeu (quand j'essaie de le placer à divers endroits ça ne s'affiche pas...
    J'ai donc décidé de remplacer "victoire des bleus" par le score, voici comment j'ai finalement procédé :
    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    int main( int argc, char* args[] )
    {
        int number = 0;
    char str[10] = {0};
     
    itoa(number, str, 10);
    printf("%d :: %s", number, str);
     
        //On définie la surface pour le message quand on gagne.
        SDL_Surface *message = NULL;
     
        // initiatlisation des scores
        int scorebleu;
        int scorerouge;
        scorebleu = 0;
        scorerouge=0;
     
        //Quitter
        bool quit = false;
     
        //La balle que l'on va utiliser
        Ball myBall;
     
        //Les raquettes
        PaddleL paddleL;
        PaddleR paddleR;
     
        //le régulateur de frame rate par secondes
        Timer fps;
     
        //Initialisation
        if(init() == false)
        {
            return 1;
        }
     
        //chargement des fichiers
        if(load_files() == false)
        {
            return 1;
        }
     
     
     
        //tq l'utilisateur n'a pas quitté
        while( quit == false )
        {
     
     
            while( SDL_PollEvent(&event) )
            {
     
                //les évènements de la balle
                myBall.handle_input();
     
                //Les évènements de la raquette
                paddleL.handle_input();
                paddleR.handle_input();
     
                //si on ferme la fenetre
                if (event.type == SDL_QUIT)
     
                {
                    //quitte le jeu
                    quit = true;
     
                }
            }
     
            //Mouvement de la balle
            myBall.move();
     
            //Si la balle tape la raquette de gauche
            if(check_collision(myBall.collbox, paddleL.boxL) == true )
            {
                //la balle "rebondit", on utilise un rand pour éviter que la trajectoire de la balle soit toujours la même et que le jeu se ferme en une boucle infinie
                myBall.xVel = rand()%30+15;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Si la balle frappe la raquette de droite
            if((check_collision(myBall.collbox, paddleR.boxR) == true) )
            {
                //la balle rebondit, même remarque, on utilise un rand.
                myBall.xVel = (rand()%30+15)*-1;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Mouvement des raquettes
            paddleL.move();
            paddleR.move();
     
            //On définit le background
            apply_surface(0, 0, background, screen);
     
            //Affichage de la balle sur l'écran
            myBall.show();
     
            //Si la balle sort du coté gauche de l'écran
            if( (myBall.collbox.x + BALL_WIDTH) < 0)
            {
                //On affiche un message : LES BLEUS ONT GAGNE
                message = TTF_RenderText_Solid(font, str, textColor);
     
     
                number=number+1;
                itoa(number, str, 10);
    printf("%d :: %s", number, str);
    j'ai donc enfermé ma variable dans un tableau de char et utilisé ce tableau pour l'affichage à l'écran. Cependant, pour l'incrémentation, j'ai un petit soucis, à savoir que le score s'affiche, mais ne s'incrémente pas, ou plutôt il s'incrémente trop, il ne gagne pas +1 mais s'incrémente en boucle... Je ne sais pas trop pourquoi ça fait ça... Je suppose que je dois placer l'incrémentation ailleurs, des idées ?
    Et enfin, comme vous l'aurez remarqué, je n'affiche qu'une variable, mais j'aurais aimé afficher du genre bleu : (score) | Rouge : (score)... une piste ?

  11. #11
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    J'ai un peu mieux regardé ton code et... c'est pas joli joli

    En fait, tu mélanges pas mal le C et le C++.

    Les variables globales, c'est mal.

    L'OO est mal utilisée: en fait, faire des objets pour les raquettes, c'est bien.
    Mais créer un objet RaquetteGauche et un objet RaquetteDroite (qui sont quasiment des copier-coller), c'est pas bien.
    Tu crées un seul objet Raquette, et tu l'instancies deux fois.

    Pour l'incrémentation du score, et bien, si tu l'incrémentes dans la boucle d'affichage comme tu le fais, ton résultat est normal.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour tes conseils, c'est vraiment gentil de prendre le temps de faire ça ^^
    Concernant les lacunes de mon code, je m'y attendais un peu, c'est un peu un "fourre tout" de différents tuto sur internet que j'ai pu trouver pour faire ceci et cela, et comme je débute en programmation les choses pas très jolies ne me sautent pas encore aux yeux...
    Pour les classes, j'ai regardé un peu les tuto , ce qui explique que je ne les utilise pas forcément très bien, ainsi que le doublon que j'ai pu faire pour les raquettes, il faudrait que je réétudie mon code en détail, mais la date limite est vendredi de la semaine prochaine, avec les cours en parrallèle et le reste du travail, je ne pense pas avoir le temps de vraiment me plancher sur la question...
    Pour l'incrémentation, là tout de suite je ne vois pas, je vais y réfléchir à tête reposée en éspérant avoir l'illumination haha
    Pour le moment je vais essayer de bien diviser mon code dans différents fichiers (pas gagné) et réussir à afficher ce satané score (ici j'affiche un int, mais au final c'est même pas ce que je veux faire... lol)
    Encore merci !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Bonjour bonjour
    Toujours pas de piste pour le score, j'ai tenté de déplacer mon incrémentation un peu au hasard parce que je ne vois pas trop où je pourrais le faire d'autre... Et pas de résultat pour le moment
    De plus, le score n'affiche que celui des bleus ou celui des rouges, j'aurais aimé afficher scorebleu - scorerouge
    Ma deadline est finalement mardi prochainn, je desespère un peu en farfouillant sur internet...

  14. #14
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Citation Envoyé par anthonynguyen0 Voir le message
    je desespère un peu en farfouillant sur internet...
    Il faut pas chercher sur Internet, il faut réfléchir au problème.

    Citation Envoyé par anthonynguyen0 Voir le message
    j'ai tenté de déplacer mon incrémentation un peu au hasard
    Et il faut pas faire des trucs au hasard en se disant "pourvu que ça marche" non plus !

    Tu as un score, je suppose donc qu'on peut faire plusieurs parties les unes après les autres, sinon, le score n'a pas de raison d'être.
    Si on peut faire plusieurs parties, ça veut donc dire qu'à un moment, tu détectes que ta partie courante est terminée, et que la partie suivante commence. Ce serait pas mal de placer ton incrémentation là, non ?
    Sinon, tu peux implémenter une machine à état: le jeu démarre dans l'état "jouer", sort de cet état avec la détection de la sortie de la balle -> à ce moment, tu incrémente le score du vainqueur, puis tu passes le jeu dans l'état "attendre la nouvelle partie", et tu affiches par exemple le message "appuyer sur une [entrée] pour rejouer". C'est plus propre.

    Si tu veux afficher plusieurs scores, tu dois les stocker (c'est ce que tu fais déjà, il me semble). Tu peux par exemple afficher le score du joueur de gauche en haut à gauche et le score du joueur de droite en haut à droite, comme là:

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Bonjour, effectivement ce serait une finalité parfaite, pour le moment je n'envisageais que de l'afficher après la phase de jeu puisque j'avais à la base voulu afficher un message de victoire, mais je ne sais pas comment l'afficher durant la phase de jeu.. la galère
    J'ai modifié mon code de cette manière :
    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
     
    int main( int argc, char* args[] )
    {
            int scorebleu = 0;
    char str[10] = {0};
     
    itoa(scorebleu, str, 10);
    printf("%d :: %s", scorebleu, str);
    int scorerouge=0;
    char str1[10]={0};
    itoa(scorerouge, str1, 10);
    printf("%d :: %s", scorerouge, str1);
     
        //On définie la surface pour le message quand on gagne.
        SDL_Surface *message = NULL;
        SDL_Surface *ecran = NULL;
        SDL_Surface *message2 = NULL;
     
        //Quitter
        bool quit = false;
     
        //La balle que l'on va utiliser
        Ball myBall;
     
        //Les raquettes
        PaddleL raquetteGauche;
        PaddleR raquetteDroite;
     
        //le régulateur de frame rate par secondes
        Timer fps;
     
        //Initialisation
        if(init() == false)
        {
            return 1;
        }
     
        //chargement des fichiers
        if(load_files() == false)
        {
            return 1;
        }
     
     
     
        //tq l'utilisateur n'a pas quitté
        while( quit == false )
        {
            //On démarre le compteur de fps
            fps.start();
     
     
            //tq il y a des evenements à gérer
            while( SDL_PollEvent(&event) )
            {
                //les évènements de la balle
                myBall.handle_input();
     
                //Les évènements de la raquette
                raquetteGauche.handle_input();
                raquetteDroite.handle_input();
     
                //si on ferme la fenetre
                if (event.type == SDL_QUIT)
                {
                    //quitte le jeu
                    quit = true;
                }
            }
     
            //Mouvement de la balle
            myBall.move();
     
            //Si la balle tape la raquette de gauche
            if(check_collision(myBall.collbox, raquetteGauche.boxL) == true )
            {
                //la balle "rebondit", on utilise un rand pour éviter que la trajectoire de la balle soit toujours la même et que le jeu se ferme en une boucle infinie
                myBall.xVel = rand()%30+15;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Si la balle frappe la raquette de droite
            if((check_collision(myBall.collbox, raquetteDroite.boxR) == true) )
            {
                //la balle rebondit, même remarque, on utilise un rand.
                myBall.xVel = (rand()%30+15)*-1;
                myBall.yVel = (myBall.yVel/abs(myBall.yVel) )*rand()%20;
            }
     
            //Mouvement des raquettes
            raquetteGauche.move();
            raquetteDroite.move();
     
            //On définit le background
            apply_surface(0, 0, background, screen);
     
            //Affichage de la balle sur l'écran
            myBall.show();
     
            //Si la balle sort du coté gauche de l'écran
            if( (myBall.collbox.x + BALL_WIDTH) < 0)
            {
                //On affiche un message : LES BLEUS ONT GAGNE
                message = TTF_RenderText_Solid(font, str1, textColor);
                ecran = TTF_RenderText_Solid(font, "-", textColor);
                message2 = TTF_RenderText_Solid(font, str, textColor);
                //Si un message doit s'afficher
                if( message != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On place le message au centre de l'écran
                    apply_surface( ( SCREEN_WIDTH - message->w ) / 4, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );
     
                    //le message est ensuite effacé
                    message = NULL;
                }
                if( ecran != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On place le message au centre de l'écran
                    apply_surface( ( SCREEN_WIDTH - ecran->w ) / 2, ( SCREEN_HEIGHT - ecran->h ) / 2, ecran, screen );
     
                    //le message est ensuite effacé
                    ecran = NULL;
                }
                if( message2 != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On centre le message à l'écran
                    apply_surface( ( SCREEN_WIDTH - message2->w ) / 2, ( SCREEN_HEIGHT - message2->h ) / 2, message2, screen );
     
                    //On retire l'affichage du message
                    message2 = NULL;
                }
     
                //Si on presse la touche espace, la balle est "reset"
                if( event.key.keysym.sym == SDLK_SPACE )
                {
                    myBall.reset();
                    myBall.reset();
     
                    scorebleu++;
                    itoa(scorebleu, str, 10);
                    printf("%d :: %s", scorebleu, str);
     
                    itoa(scorerouge, str1, 10);
                    printf("%d :: %s", scorerouge, str1);
                }
            }
     
            //Si la balle sort du coté droit de l'écran
            if( myBall.collbox.x > SCREEN_WIDTH)
            {
                //On affiche à l'écran "les rouges ont gagné !
                message = TTF_RenderText_Solid(font, str1, textColor);
                ecran = TTF_RenderText_Solid(font, "-", textColor);
                message2 = TTF_RenderText_Solid(font, str, textColor);
     
                //Si un message doit s'afficher
                if( message != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On centre le message à l'écran
                    apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );
     
                    //On retire l'affichage du message
                    message = NULL;
                }
                  if( message2 != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On centre le message à l'écran
                    apply_surface( ( SCREEN_WIDTH - message2->w ) / 2, ( SCREEN_HEIGHT - message2->h ) / 2, message2, screen );
     
                    //On retire l'affichage du message
                    message2 = NULL;
                }
                if( ecran != NULL )
                {
                    //on applique le background à l'écran
                    apply_surface( 0, 0, background, screen );
     
                    //On place le message au centre de l'écran
                    apply_surface( ( SCREEN_WIDTH - ecran->w ) / 2, ( SCREEN_HEIGHT - ecran->h ) / 2, ecran, screen );
     
                    //le message est ensuite effacé
                    ecran = NULL;
                }
     
                //Si on presse la touche espace, la balle est reset
                if( event.key.keysym.sym == SDLK_SPACE )
                {
                    myBall.reset();
                    scorerouge++;
     
                    itoa(scorebleu, str, 10);
                    printf("%d :: %s", scorebleu, str);
     
                    itoa(scorerouge, str1, 10);
                    printf("%d :: %s", scorerouge, str1);
     
                }
            }
     
            //Affiche les raquettes à l'écran
            raquetteGauche.show();
            raquetteDroite.show();
     
     
            if( SDL_Flip( screen ) == -1 )
            {
                return 1;
            }
     
            //on définie un plafond pour le frame rate.
            if(fps.get_ticks() < 1000 / FRAMES_PER_SECOND)
            {
                SDL_Delay( (1000/ FRAMES_PER_SECOND) - fps.get_ticks() );
            }
        }
     
        clean_up();
     
        return 0;
    }
    COmme vous pouvez le constater, il comporte des problèmes : l'incrémentation d'abord, puisque au premier tour, le score restera à 0...
    Le second : Le score ne s'affiche as correctement, seul un des 3 éléments que je cherche à afficher s'affiche, autrement dit, impossible d'afficher les 3 à la fois...
    Ayant réalisé mon code à l'aide de tuto (notamment des tuto vidéos) et non pas comme tous mes collègues avec le code pré-fait du prof, je me retrouve un peu perdu... Il est maintenant trop tard pour faire marche arrière, j'ai voulu "faire mon amlin" et je le paie un peu ^^ Encore une fois merci de ta patience et désolé d'être un peu long à la détente...

  16. #16
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Citation Envoyé par anthonynguyen0 Voir le message
    il comporte des problèmes : l'incrémentation d'abord, puisque au premier tour, le score restera à 0...
    On peut facilement résoudre ça en passant par des états, comme j'ai écrit plus haut.

    Citation Envoyé par anthonynguyen0 Voir le message
    Le second : Le score ne s'affiche as correctement, seul un des 3 éléments que je cherche à afficher s'affiche, autrement dit, impossible d'afficher les 3 à la fois...
    Et bien, concernant l'affichage de tes raquettes, tu en as deux, tu affiches la première, puis la seconde.
    Tu dois faire la même chose pour tes scores: tu affiches le premier, puis le second.
    Le message "appuyer sur espace pour rejouer" est, lui, conditionné à l'état (une variable).

    Tu aurais donc, grosso modo, dans l'update de ta boucle de jeu:
    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
    lire les entrées clavier
    bougerRaquette1
    bougerRaquette2
    si (état = jeu)
    {
      si (balle sort de l'écran)
      {
        état <- attenteTouche
        si (sortie à droite) incrémenter le score du joueur de gauche
        sinon incrémenter le score du joueur de droite
      }
    }
    sinon // état = attenteTouche
    {
      si (appui sur espace)
      {
        redémarrer la partie
        état <- jeu
      }
    }
    Et dans l'affichage de ta boucle de jeu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    afficherRaquette1
    afficherRaquette2
    afficherScore1
    afficherScore2
    si (état = attenteTouche) afficherMessageAttenteTouche
    Un autre conseil: ne te prends pas la tête avec les char* et les char[]. Tu es en c++, utilise les std::str !

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    Merci pour cette réponse aussi rapide !
    Il faut donc que je fasse une nouvelle classe score ?

    Et qu'est ce que l'update ?
    Si balle sort de l'écran correspond à : if( (myBall.collbox.x + BALL_WIDTH) <0 && (myBall.collbox.x > SCREEN_WIDTH) < 0) ?
    Je crois que je vais finir par abandonner l'idée d'afficher ce satané score lol

  18. #18
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Citation Envoyé par anthonynguyen0 Voir le message
    Il faut donc que je fasse une nouvelle classe score ?
    Euh... Non, ça ne servira à rien. Le score, c'est un nombre entier, tu as juste besoin de l'afficher (après, je ne sais plus comment on fait avec SDL_ttf).
    Tu as fait une méthode pour afficher du texte, il suffit de l'appeler plusieurs fois dans ta boucle (un appel pour le score gauche, un pour le droit, et éventuellement un pour le message d'attente).

    Citation Envoyé par anthonynguyen0 Voir le message
    Et qu'est ce que l'update ?
    Tu peux jeter un œil à cet article: http://alexandre-laurent.developpez....boucle-de-jeu/

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Points : 10
    Points
    10
    Par défaut
    ok je pense avoir capté pour l'update merci
    Pour le si balle sort de l'écran, : if( (myBall.collbox.x + BALL_WIDTH) <0 && (myBall.collbox.x > SCREEN_WIDTH) < 0) est-ce correct ?

    EDIT : j'suis en train de me perdre et j'ai un peu l'impression de vous faire perdre votre temps désolé... J'ai laissé mon code pendant 2 semaines (oubli d'ajout du score) pensant avoir fini et aujourd'hui j'suis un peu perdu...

  20. #20
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 615
    Points
    2 615
    Par défaut
    Tu t'es un peu emmêlé dans les variables, je crois, et tu fais une erreur de logique: tu utilises un ET, mais la balle ne peut pas sortir à droite ET à gauche en même temps.

Discussions similaires

  1. Erreur de compilation pour projet EJB3-JBOSS
    Par aniss77 dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 26/10/2009, 13h42
  2. Erreur de compilation de projet
    Par aelmalki dans le forum Maven
    Réponses: 0
    Dernier message: 11/06/2009, 19h27
  3. Réponses: 16
    Dernier message: 26/05/2009, 18h17
  4. Erreur de compilation VBA "Projet ou bibliothèque introuvable"
    Par princeyobs dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/03/2009, 12h14
  5. Réponses: 7
    Dernier message: 14/04/2008, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo