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

C Discussion :

problème jeu pong


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut problème jeu pong
    Bonjour, alors voila mon problème, je début dans le langage C et j'essaye de crée un pong, je pense que vous connaisé la basse de se jeu. Mes je bute sur une phase de mon programme, j'ai crée une ball, et 2bare, mais la ball part de gauche et quand elle est a droit elle ne ricoche pas, elle disparait, je vous montre mon code

    merci de votre aide
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    #define GAUCHE 0
    #define DROITE 1
    #define HAUT 2
    #define BAS 3
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL,*bare = NULL, *ligne=NULL,*bare2=NULL,*ball=NULL;
        SDL_Rect positionbare,positionligne,positionbare2, positionball;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
     
        int bougerH = DROITE;
        int bougerV = HAUT;
     
     
     
     
        SDL_Init(SDL_INIT_VIDEO);
     
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);//charge la fenetre et la taille
        bare = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        bare2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
        SDL_WM_SetCaption("Pong", NULL);
     
        positionbare2.x = 620;
        positionbare2.y = 180;
        positionligne.x= (640 / 2)- (2 / 2) ;//coordonné de la ligne
        positionligne.y=(480 / 2)- (480 / 2);
        positionbare.x = 10;
        positionbare.y = 180;
        positionball.x= 0;
        positionball.y= 0;
        SDL_EnableKeyRepeat(10, 10);// répétition des touche
     
     
     
        while(continuer)//boucle event
        {
         SDL_PollEvent(&event); /* On attend un évènement qu'on récupère dans event */
            switch(event.type) /* On teste le type d'évènement */
            {
                case SDL_QUIT: /* Si c'est un évènement QUITTER */
                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                    break;
                case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
                {
                case SDLK_UP: // Flèche haut
                    positionbare.y--;
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionbare.y++;
                    break;
                }
            break;
            }
     
          if(positionball.x == 0)
        bougerH = DROITE;
    else if(positionball.x == (640 - ball->width))
        bougerH = GAUCHE;
    if(positionball.y == 0)
        bougerV = BAS;
    else if(positionball.y == (480 - ball->height))
        bougerV = HAUT;
    //...
    switch(bougerV)
    {
        case HAUT:
            positionball.y--;
        break;
        case BAS:
            positionball.y++;
        break;
    }
    switch(bougerH)
    {
        case GAUCHE:
            positionball.x--;
        break;
        case DROITE:
            positionball.x++;
        break;
    }
     
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0,0));
            SDL_FillRect(ligne, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(ligne, NULL, ecran, &positionligne);
            SDL_FillRect(bare, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare, NULL, ecran, &positionbare); // Collage de la surface sur l'écran
            SDL_FillRect(bare2, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare2, NULL, ecran, &positionbare2);
            SDL_FillRect(ball, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(ball, NULL, ecran, &positionball);
            SDL_Flip(ecran);//on initialise l'écran
     
     
        }
     
     
     
     
        SDL_FreeSurface(bare); // Libération de la surface
        SDL_Quit();
     
     
     
        return EXIT_SUCCESS;
    }

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Essaye plutôt de tester la position de la balle non pas par rapport à un seul point, mais par rapport à une limite.
    Je m'explique: au lieu de tester si balle.x vaut le bort de l'écran, testes plutôt si balle.x est supérieur au bord de l'écran.

    De plus, je ne vois rien dans ton code qui ferait ricocher la balle sur les deux barres.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Pour le début, je cherche déjà a arriver a la faire ricoché, après je vé essayé de la faire ricoché sur les barre et essayé de la faire allé en diagonal et la faire ricoché sur les coté.
    Ton idée n'est pas mauvaise, mais je n'est pas vraiment d'idée pour comment le faire

    je suis dans le noir total sur cette parti

    aide moi a me mettre sur la piste, a me donné la lumière ^^, pas le code bien sur
    sinon sa sert a rien

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Je t'avais déjà bien aidé avec les mots soulignés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(positionball.x <= 0)
        bougerH = DROITE;
    else if(positionball.x >= (640 - ball->width))
        bougerH = GAUCHE;
    if(positionball.y <= 0)
        bougerV = BAS;
    else if(positionball.y >= (480 - ball->height))
        bougerV = HAUT;

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    le code que j'ai donné ne marche pas, car je me suis trompé
    voici un que je peu compilé mais la ball ne ricoche toujours pas
    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
        #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL,*bare = NULL, *ligne=NULL,*bare2=NULL,*ball=NULL;
        SDL_Rect positionbare,positionligne,positionbare2, positionball;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
     
        SDL_Init(SDL_INIT_VIDEO);
     
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);//charge la fenetre et la taille
        bare = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        bare2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
        SDL_WM_SetCaption("Pong", NULL);
     
        positionbare2.x = 620;
        positionbare2.y = 180;
        positionligne.x= (640 / 2)- (2 / 2) ;//coordonné de la ligne
        positionligne.y=(480 / 2)- (480 / 2);
        positionbare.x = 10;
        positionbare.y = 180;
        positionball.x= 0;
        positionball.y= 0;
        SDL_EnableKeyRepeat(10, 10);// répétition des touche
     
     
     
        while(continuer)//boucle event
        {
         SDL_PollEvent(&event); /* On attend un évènement qu'on récupère dans event */
            switch(event.type) /* On teste le type d'évènement */
            {
                case SDL_QUIT: /* Si c'est un évènement QUITTER */
                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                    break;
                case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
                {
                case SDLK_UP: // Flèche haut
                    positionbare.y--;
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionbare.y++;
                    break;
                }
            break;
            }
     
           tempsActuel = SDL_GetTicks();
     
        if(positionball.x >=0)
        {
        if (tempsActuel - tempsPrecedent > 30)
        {
        positionball.x++;
        tempsPrecedent = tempsActuel;
        }
        else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
        {
        SDL_Delay(30 - (tempsActuel - tempsPrecedent));
        }
        }
        else if (positionball.x = 640)
        {
        if (tempsActuel - tempsPrecedent > 30)
        {
        positionball.x--;
        tempsPrecedent = tempsActuel;
        }
        else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
        {
        SDL_Delay(30 - (tempsActuel - tempsPrecedent));
        }
        }
        else
        {}
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0,0));
            SDL_FillRect(ligne, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(ligne, NULL, ecran, &positionligne);
            SDL_FillRect(bare, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare, NULL, ecran, &positionbare); // Collage de la surface sur l'écran
            SDL_FillRect(bare2, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare2, NULL, ecran, &positionbare2);
            SDL_FillRect(ball, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(ball, NULL, ecran, &positionball);
            SDL_Flip(ecran);//on initialise l'écran
     
     
        }
     
     
     
     
        SDL_FreeSurface(bare); // Libération de la surface
        SDL_Quit();
     
     
     
        return EXIT_SUCCESS;
    }
    quand je change mon code contre la parti de celui que tu ma donné, j'ai des erreur de ) et de ;

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (positionball.x = 640)
    Là tu ne fais pas un test, tu assignes la valeur 640 à positionball.x.

  7. #7
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    toute cette partie est fumeuse et ne fait pas ce que tu penses j ai l impression
    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
     
    /* notamment ici, x est toujours positif la condition est toujours vrai => tu avance toujours */
    if(positionball.x >=0 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    positionball.x++;
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }         
    /* x ne vaut qu une seule et unique fois 640, tu ne recule d un pixel, qu une seule fois */
            else if (positionball.x == 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    /*positionball.x--;*/
                    positionball.x = 0;
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
    /* du coup ce else doit pouvoir partir */
            else
            {
            }
    je le remplace par ca et sa rebondi
    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
     
    /* sens_ball est un vulgaire int, pourrait en faire une enum peut etre ? */
    if( positionball.x == 0 )
           {
               sens_ball = 1;
           }
           else
           {
               if( positionball.x == 640 )
               {
                    sens_ball = -1;
               }
           }
     
            if(positionball.x >=0 && positionball.x <= 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    positionball.x += ( PAS * sens_ball );
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
    [edit] au fait PAS est un define nu nombre de pixel de deplacement

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    bonjour, merci pour ta réponse. Mais je ne prendrais pas ton code comme sa ^^
    car j'ai pas compris se que tu fait et se que tu rajoute, je c'est pour toi sa parait évidant mais pas pour moi ^^, je début dans la programmation, est oui il faut un début a tout

    PAS, est une variable ? si oui, a définir a combien?? 0 ou le nombre de pixel ou se trouve la ball??

    Merci pour t'es explication

  9. #9
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    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
     
     
    /* sens_ball est un vulgaire int, pourrait en faire une enum peut etre ? */
    /* si je suis a gauche de l ecran, le sens de ma balle est positif (sur un 
    repere carthiesien par exemple) */
    if( positionball.x == 0 )
           {
               sens_ball = 1;
           }
           else
           {
               /* sinon si j ai atteind le bord droit je veux faire demi tour */
               if( positionball.x == 640 )
               {
                    sens_ball = -1;
               }
           }
     
            /* si je suis bien dans les limites de mon ecran */
            if(positionball.x >=0 && positionball.x <= 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    /* j ajoute un certains nombre de pixels (mon PAS) mais en le 
                    mutlipliant par le sens selon le sens de déplacement souhaité je vais soit 
                    ajouter mon PAS à mon x jusqu'a 640, soit decrementer x jusqu a 0 car dans 
                    ce cas mon sens est negatif */
                    positionball.x += ( PAS * sens_ball );
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, 
                          on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
    apres j ai pas fait grand chose, j ai laissé ta gestion es temps et supprimer un bloc if else qui a mon sens ne servait a rien.

    un peu plus d explication, si c'est pas clair pose moi des questions

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    La PAS dans mon programme, je doit lui donne quel valeur?
    car il me demande de le déclaré??
    mais je c'est pas quoi mettre?

  11. #11
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    j ai fait un
    pour que ca aille un peu plus vite, toi dans le code que tu a donné il vallait 1.

    apres a adapter selon la vitesse souhaitée

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Ha oki c'est pour augmenté la vitesse de la ball, si j'ai bien compris
    après je doit arrivé a faire ricoché la ball contre les barres et quand elle sort elle se remet aux début

  13. #13
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    a ben apres...

    i va falloir complexifier tout ca, peut etre gerer un sens _x et un sens_y de la balle, verifier a chaque deplacement les collisions possibles... et réagir en conséquence.

    bon courage

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Merci beaucoup, car je crois que j'en aurai besoin
    j'espère arrive ou bout de mon projet, grâce a toi j'ai déjà bien avancé

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut

    le code marche pas

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #define PAS   2
     
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL,*bare = NULL, *ligne=NULL,*bare2=NULL,*ball=NULL;
        SDL_Rect positionbare,positionligne,positionbare2, positionball;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
        int versLaDroit=1;
        int sens_ball=0;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);//charge la fenetre et la taille
        bare = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        bare2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
        SDL_WM_SetCaption("Pong", NULL);
     
        positionbare2.x = 620;
        positionbare2.y = 180;
        positionligne.x= (640 / 2)- (2 / 2) ;//coordonné de la ligne
        positionligne.y=(480 / 2)- (480 / 2);
        positionbare.x = 10;
        positionbare.y = 180;
        positionball.x= 0;
        positionball.y= 0;
        SDL_EnableKeyRepeat(10, 10);// répétition des touche
     
     
     
        while(continuer)//boucle event
        {
         SDL_PollEvent(&event); /* On attend un évènement qu'on récupère dans event */
            switch(event.type) /* On teste le type d'évènement */
            {
                case SDL_QUIT: /* Si c'est un évènement QUITTER */
                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                    break;
                case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
                {
                case SDLK_UP: // Flèche haut
                    positionbare.y--;
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionbare.y++;
                    break;
                }
            break;
            }
     
     
     
          if( positionball.x == 0 )
           {
               sens_ball = 1;
           }
           else
           {
               if( positionball.x == 640 )
               {
                    sens_ball = -1;
               }
           }
     
            if(positionball.x >=0 && positionball.x <= 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    positionball.x += ( PAS * sens_ball );
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
     
     
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0,0));
            SDL_FillRect(ligne, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(ligne, NULL, ecran, &positionligne);
            SDL_FillRect(bare, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare, NULL, ecran, &positionbare); // Collage de la surface sur l'écran
            SDL_FillRect(bare2, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare2, NULL, ecran, &positionbare2);
            SDL_FillRect(ball, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(ball, NULL, ecran, &positionball);
            SDL_Flip(ecran);//on initialise l'écran
     
     
        }
     
     
     
     
        SDL_FreeSurface(bare); // Libération de la surface
        SDL_Quit();
     
     
     
        return EXIT_SUCCESS;
    }
    édit: sens_ball je l'ais mis int=0 car je savais pas quoi mettre?

  16. #16
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par kent167 Voir le message
    sens_ball je l'ais mis int=0 car je savais pas quoi mettre?

    C'est normal que ça ne marche pas alors! Ta balle ne bougera jamais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionball.x += ( PAS * sens_ball );
    J'ai la nette impression que tu ne comprends pas la solution apportée par BainE. sens_ball donne le sens de déplacement de ta balle. -1 pour GAUCHE, +1 pour DROITE.
    Pour t'aider à comprendre, remplace toutes les variables par des valeurs et fais les calculs de déplacement. Tu verras alors peut-être mieux le déroulement de ton application.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    ma ball bouge avec int=0 mais elle disparait quand elle est a gauche, oui tu a raison je ne comprend pas vraiment le fonctionnement de cette branche du programme, je mais int=1 marche pas je mais long=1 marche pas
    biensur long sens_ball=1

  18. #18
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Essaye de faire des phrases un peu construites, j'ai du mal à te comprendre
    Citation Envoyé par kent167 Voir le message
    ma ball bouge avec int sens_ball=0
    Tu es bien sûr de ça???

    En gros, ta balle part de la gauche de la position 0 on va dire. Elle va donc vers la droite, donc au début, il faut que sens_ball = 1 (je rappelle que +1 = droite et -1 = gauche). Car lors du calcul de la nouvelle position, on aura le calcul simplifié suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionball.x = positionball.x + 1
    Le '+ 1' correspond au (PAS * sens_ball). J'ai choisi arbitrairement un PAS de 1 (que tu peux augmenter pour accélérer le mouvement) et on a dit que sens_ball = 1. La balle se déplace donc d'une unité vers la droite.

    Sur les bords, on ne veut pas que la balle sorte de l'écran, mais qu'elle ricoche. Donc si sa position en abscisse dépasse la taille de l'écran (supérieure ou égale à 640), on inverse juste le sens de déplacement pour aller vers la gauche au lieu de la droite (sens_ball = -1). Le calcul sera alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionball.x = positionball.x - 1
    pour revenir vers le bord gauche de l'écran.

    Pour ricocher sur le côté gauche, on refait le même calcul avec le bord. On ne veut pas que la balle descende en dessous de la position 0. Si positionball.x atteint alors cette valeur (inférieure ou égale à 0), hop on rechange le sens du mouvement vers la droite (sens_ball = 1). On repart alors dans l'autre sens, et ainsi de suite...

    Je peux difficilement être plus clair!

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Merci de ta précision, j'ai compris le sens de sont code, mais je met aux début int sens_ball=1 mais la ball ne ricoche PAS sur le coté Droit mon code est celui-ci

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #define PAS 1
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL,*bare = NULL, *ligne=NULL,*bare2=NULL,*ball=NULL;
        SDL_Rect positionbare,positionligne,positionbare2, positionball;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
        int versLaDroit=1;
        int sens_ball=0;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);//charge la fenetre et la taille
        bare = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        bare2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
        SDL_WM_SetCaption("Pong", NULL);
     
        positionbare2.x = 620;
        positionbare2.y = 180;
        positionligne.x= (640 / 2)- (2 / 2) ;//coordonné de la ligne
        positionligne.y=(480 / 2)- (480 / 2);
        positionbare.x = 10;
        positionbare.y = 180;
        positionball.x= 10;
        positionball.y= 10;
        SDL_EnableKeyRepeat(10, 10);// répétition des touche
     
     
     
        while(continuer)//boucle event
        {
         SDL_PollEvent(&event); /* On attend un évènement qu'on récupère dans event */
            switch(event.type) /* On teste le type d'évènement */
            {
                case SDL_QUIT: /* Si c'est un évènement QUITTER */
                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                    break;
                case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
                {
                case SDLK_UP: // Flèche haut
                    positionbare.y--;
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionbare.y++;
                    break;
                }
            break;
            }
     
     
     
          if( positionball.x == 0 )
           {
               sens_ball = 1;
           }
           else
           {
               if( positionball.x == 640 )
               {
                    sens_ball = -1;
               }
           }
     
            if(positionball.x >=0 && positionball.x <= 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    positionball.x += ( PAS * sens_ball );
                    tempsPrecedent = tempsActuel;
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
     
     
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0,0));
            SDL_FillRect(ligne, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(ligne, NULL, ecran, &positionligne);
            SDL_FillRect(bare, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare, NULL, ecran, &positionbare); // Collage de la surface sur l'écran
            SDL_FillRect(bare2, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare2, NULL, ecran, &positionbare2);
            SDL_FillRect(ball, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(ball, NULL, ecran, &positionball);
            SDL_Flip(ecran);//on initialise l'écran
     
     
        }
     
     
     
     
        SDL_FreeSurface(bare); // Libération de la surface
        SDL_Quit();
     
     
     
        return EXIT_SUCCESS;
    }
    PS: je reviens se soir

    Merci de votre aide qui est précieuse

  20. #20
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    essaye de repartir de ce code qui semble fonctionner (en tout cas chez moi )

    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
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    #define PAS         2
     
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL,*bare = NULL, *ligne=NULL,*bare2=NULL,*ball=NULL;
        SDL_Rect positionbare,positionligne,positionbare2, positionball;
        SDL_Event event;
        int continuer = 1;
        int tempsPrecedent = 0, tempsActuel = 0;
        int sens_ball = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);//charge la fenetre et la taille
        bare = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        bare2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 100, 32, 0, 0, 0, 0); // Allocation de la surface
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
        SDL_WM_SetCaption("Pong", NULL);
     
        positionbare2.x = 620;
        positionbare2.y = 180;
        positionligne.x= (640 / 2)- (2 / 2) ;//coordonné de la ligne
        positionligne.y=(480 / 2)- (480 / 2);
        positionbare.x = 10;
        positionbare.y = 180;
        positionball.x= 0;
        positionball.y= 0;
        SDL_EnableKeyRepeat(10, 10);// répétition des touche
     
        while(continuer)//boucle event
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                        {
                        case SDLK_UP: // Flèche haut
                            positionbare.y -= PAS;
                            break;
                        case SDLK_DOWN: // Flèche bas
                            positionbare.y += PAS;
                            break;
                        }
                    break;
            }
     
           tempsActuel = SDL_GetTicks();
     
           if( positionball.x == 0 )
           {
               sens_ball = 1;
           }
           else
           {
               if( positionball.x == 640 )
               {
                    sens_ball = -1;
               }
           }
     
            if(positionball.x >=0 && positionball.x <= 640 )
            {
                if (tempsActuel - tempsPrecedent > 30)
                {
                    positionball.x += ( PAS * sens_ball );
                    tempsPrecedent = tempsActuel;
                }
                else
                {
                    SDL_Delay(30 - (tempsActuel - tempsPrecedent));
                }
            }
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0,0));
            SDL_FillRect(ligne, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(ligne, NULL, ecran, &positionligne);
            SDL_FillRect(bare, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare, NULL, ecran, &positionbare); // Collage de la surface sur l'écran
            SDL_FillRect(bare2, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(bare2, NULL, ecran, &positionbare2);
            SDL_FillRect(ball, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));//charge la couleur de l'écran
            SDL_BlitSurface(ball, NULL, ecran, &positionball);
            SDL_Flip(ecran);//on initialise l'écran
        }
     
        SDL_FreeSurface(bare); // Libération de la surface
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }

Discussions similaires

  1. [Lazarus] Problème lors de la création du jeu Pong
    Par obscuwave dans le forum Lazarus
    Réponses: 2
    Dernier message: 25/06/2015, 13h29
  2. Problème jeu de caractère dans base.
    Par juliobarna dans le forum Outils
    Réponses: 3
    Dernier message: 05/05/2007, 16h56
  3. Problème jeu de la vie de Wolfram
    Par romromp dans le forum Pascal
    Réponses: 14
    Dernier message: 11/03/2007, 19h58
  4. Problème jeu réseau - media center
    Par AsTeR_ dans le forum Windows XP
    Réponses: 1
    Dernier message: 03/12/2006, 13h07
  5. problème avec pong
    Par snake264 dans le forum OpenGL
    Réponses: 2
    Dernier message: 11/11/2006, 19h50

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