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

SDL Discussion :

Jeu de la vie [SDL 1.2]


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Jeu de la vie
    Bonjour,

    Connaissant depuis peu le Jeu de la vie, je me suis lancer dans une réalisation personnel de se jeu, le tout en c++ procédural avec la sdl 1.2.

    La génération de mon tableau fonctionne bien l'affichage aussi mais lorsque je rajoute la gestion des cellules au fur et a mesure des générations, cela m'affiche un écran noir, mon code :
    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
     
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #include <iostream>
    #include <SDL/SDL.h>
    #include <ctime>
     
    using namespace std;
     
     
    int main ( int argc, char** argv )
    {
     
     
        int maxLargeur,maxHauteur;
     
        //Initialisation SDL
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
     
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
     
        SDL_Surface* screen,*image;
        SDL_Rect positionImage;
     
     
        maxLargeur=SDL_GetVideoInfo()->current_w;
        maxHauteur=SDL_GetVideoInfo()->current_h;
     
     
        positionImage.x = 0;
        positionImage.y = 0;
     
        int maxX = maxHauteur/5;
        int maxY = maxLargeur/5;
        int grille[maxX][maxY];
        int alea = 0;
        srand(time(NULL));
        int j = 0;
     
        //Initialisation grille
        for(int i = 1; i < maxX; i++)
        {
            for(int j = 0; j < maxY; j++)
            {
     
                alea = rand() %(1-11);
     
                if(alea == 1)
                {
                    grille[i][j]=1;
                }
                else
                {
                    grille[i][j]=0;
                }
     
     
            }
        }
     
     
     
     
     
     
     
        // create a new window
        screen=SDL_SetVideoMode(maxLargeur, maxHauteur, 32, SDL_HWSURFACE| SDL_FULLSCREEN |SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
     
     
     
        bool continuer = false;
     
        while (!continuer)
        {
     
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    continuer = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = true;
                        break;
                    }
                }
            }
                int tempsActuel = SDL_GetTicks();
                int tempsPrecedent;
                if (tempsActuel - tempsPrecedent > 30) /* Si 30 ms se sont écoulées */
                {
     
     
                    int resultat;
     
                    // Affichage Map
                    for(int i = 1; i < maxX; i++)
                    {
                        for(int j = 0; j < maxY; j++)
                        {
     
     
     
                            if(grille[i][j]==0)
                            {
     
                                image = SDL_LoadBMP("vide.bmp");
                                /* On blitte par-dessus l'écran */
                                SDL_BlitSurface(image, NULL, screen, &positionImage);
                                SDL_FreeSurface(image);
                            }
                            else
                            {
                                image = SDL_LoadBMP("plein.bmp");
                                /* On blitte par-dessus l'écran */
                                SDL_BlitSurface(image, NULL, screen, &positionImage);
                                SDL_FreeSurface(image);
                            }
                            positionImage.x = positionImage.x +6;
                            SDL_Flip(screen);
     
                            //Gestion cellule
     
                            if(grille[i-1][j-1]==1 && i!=0 )
                            {
                                resultat++;
                            }
                            if(grille[i-1][j]==1 && i!=0 )
                            {
                                resultat++;
                            }
     
                            if(grille[i-1][j+1]==1 && i!=0 && j!=maxX)
                            {
                                resultat++;
                            }
     
     
     
                            if(grille[i][j-1]==1 && j!=0)
                            {
                                resultat++;
                            }
                            if(grille[i][j+1]==1 && j!=maxX )
                            {
                                resultat++;
                            }
     
     
                            if(grille[i+1][j-1]==1 && i!=maxY && j!=0)
                            {
                                resultat++;
                            }
                            if(grille[i+1][j]==1 && i!=maxY && j!=maxX)
                            {
                                resultat++;
                            }
                            if(grille[i+1][j+1]==1 && i!=maxY && j!=maxX)
                            {
                                resultat++;
                            }
     
     
                            if(grille[i][j]==0 && resultat==3)
                            {
                                grille[i][j]=1;
                            }
                            else if(grille[i][j]==1 && resultat==2 or resultat==3)
                            {
                                grille[i][j]=1;
                            }
                            else
                            {
                                grille[i][j]=0;
                            }
                            // Fin Gestion cellule
     
                        }
     
                        positionImage.x = 0;
                        positionImage.y = positionImage.y +6;
     
     
                    }
     
     
                    positionImage.x = 0;
                    positionImage.y = 0;
     
                }
     
        }
     
     
     
     
     
        return 0;
    }




    Avez vous une idée de mon problème ? Au passage si vous avez des améliorations niveau rapidité ou autre, je veux bien.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Votre premier gros soucis. En effet, à chaque tour vous rechargez l'image (SDL_LoadBMP) ce qui prend un temps monstre à chaque fois. L'idée est de charger l'image avant la boucle principale et de la garder en mémoire (une unique fois). Et après, vous ne devez pas oublier le SDL_FreeSurface() sur l'image.
    De plus, vous devez vérifier ce que retourne SDL_LoadBMP. Rien ne prouve que vous arrivez à charger l'image (il ne trouve pas le fichier).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci d'avoir pris le temps de m'aider, j'ai tenté d'appliquer vos précieux conseil en rajoutant la gestion des erreurs de chargements d'images et en chargeant l'image avant ma boucle principal et la ré-allocation de la mémoire une fois la fin de boucle.
    Constatez par vous même :

    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
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #include <iostream>
    #include <SDL/SDL.h>
    #include <ctime>
     
    using namespace std;
     
     
    int main ( int argc, char** argv )
    {
     
     
        int maxLargeur,maxHauteur;
     
        //Initialisation SDL
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
     
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
     
        SDL_Surface* screen,*imagePlein,*imageVide; // Ajout des images
        SDL_Rect positionImage;
     
     
        maxLargeur=SDL_GetVideoInfo()->current_w;
        maxHauteur=SDL_GetVideoInfo()->current_h;
     
        maxLargeur =500;
        maxHauteur =500;
     
        positionImage.x = 0;
        positionImage.y = 0;
     
        int maxX = maxHauteur/10;
        int maxY = maxLargeur/10;
        int grille[maxX][maxY];
        int alea = 0;
        srand(time(NULL));
        int j = 0;
     
        //Initialisation grille
        for(int i = 1; i < maxX; i++)
        {
            for(int j = 0; j < maxY; j++)
            {
     
                alea = rand() %(1-11);
     
                if(alea == 1)
                {
                    grille[i][j]=1;
                }
                else
                {
                    grille[i][j]=0;
                }
     
     
            }
        }
     
     
     
     
     
     
     
        // Création Fenêtre
     
    // | SDL_FULLSCREEN
     
        screen=SDL_SetVideoMode(maxLargeur, maxHauteur, 32, SDL_HWSURFACE |SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
     
     
     
        bool continuer = false;
     
        imagePlein = SDL_LoadBMP("plein.bmp");
        imageVide = SDL_LoadBMP("vide.bmp");
     
        // Gestion des erreurs, si problème on ferme tout
        if (!imagePlein)
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
            continuer = true;
        }
        if (!imageVide)
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
            continuer = true;
        }
     
        // Boucle principal
     
        while (!continuer)
        {
     
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    continuer = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = true;
                        break;
                    }
                }
            }
     
                int tempsActuel = SDL_GetTicks();
                int tempsPrecedent;
     
                if (tempsActuel - tempsPrecedent > 30) /* Si 30 ms se sont écoulées */
                {
     
                    // Initialisation variable,
                    int resultat;
     
                    // Affichage Map
                    for(int i = 1; i < maxX; i++)
                    {
                        for(int j = 0; j < maxY; j++)
                        {
     
     
     
                            if(grille[i][j]==0)
                            {
                                /* On blitte par-dessus l'écran */
                                SDL_BlitSurface(imageVide, NULL, screen, &positionImage);
                            }
                            else
                            {
                                SDL_BlitSurface(imagePlein, NULL, screen, &positionImage);
     
                            }
                            positionImage.x = positionImage.x +11;
     
                            //Affichage écran
                            SDL_Flip(screen);
     
                            //Gestion cellule En commentaire car ca bugait précédemment 
    /*
                            if(grille[i-1][j-1]==1 && i!=0 )
                            {
                                resultat++;
                            }
                            if(grille[i-1][j]==1 && i!=0 )
                            {
                                resultat++;
                            }
     
                            if(grille[i-1][j+1]==1 && i!=0 && j!=maxX)
                            {
                                resultat++;
                            }
     
     
     
                            if(grille[i][j-1]==1 && j!=0)
                            {
                                resultat++;
                            }
                            if(grille[i][j+1]==1 && j!=maxX )
                            {
                                resultat++;
                            }
     
     
                            if(grille[i+1][j-1]==1 && i!=maxY && j!=0)
                            {
                                resultat++;
                            }
                            if(grille[i+1][j]==1 && i!=maxY && j!=maxX)
                            {
                                resultat++;
                            }
                            if(grille[i+1][j+1]==1 && i!=maxY && j!=maxX)
                            {
                                resultat++;
                            }
     
     
                            if(grille[i][j]==0 && resultat==3)
                            {
                                grille[i][j]=1;
                            }
                            else if(grille[i][j]==1 && resultat==2 or resultat==3)
                            {
                                grille[i][j]=1;
                            }
                            else
                            {
                                grille[i][j]=0;
                            }*/
                            // Fin Gestion cellule
     
                        }
     
                        positionImage.x = 0;
                        positionImage.y = positionImage.y +11;
     
     
                    }
     
     
                    positionImage.x = 0;
                    positionImage.y = 0;
     
     
                }
        }
                    //Vidage mémoire
                    SDL_FreeSurface(imagePlein);
                    SDL_FreeSurface(imageVide);
     
     
        return 0;
    }
    Seulement j'ai un autre problèmes qui est survenue, maintenant au chargement du programme il m'affiche un écran noir, comme si il ne pouvait pas blitter les images précédemment chargé, est ce possible ? Il est probable que c'est moi qui est mal fait les modifications.

    En tout cas, je suis ravie que vous m'ayez aidé car pour un prochain programme je saurais qu'il faut d'abord déclaré les images pour plus de rapidité.

    Dans l'attente du réponse, Spiritus44

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Vous avez vu cette ligne :
    Essayez donc d'afficher alea, par curiosité
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    J'ai beau afficher, tout fonctionne parfaitement, il tire un nombre compris entre 1 et 10 et si le nombre est 1 on met un 1 dans la grille sinon un 0. Il y aurait t'il une erreur que je n'est pas vu ? Et quand bien même une erreur de ma variable aléa ne pourrait pas me causer de problème dans l'affichage, non ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    C'est mon compilateur qui a trouvé la raison :
    main2.cpp:125:13: attention : ‘tempsPrecedent’ may be used uninitialized in this function [-Wuninitialized]
    En effet, une variable non initialisée peut être différente de zéro. Si vous ne lui donnez pas de valeur, c'est une valeur aléatoire, qui peut casser votre test !
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Olala, merci de votre aide, vous aviez raison il fallait initialisé le tout à 0 ! Sauf que je m’interroge, pourquoi mon compilateur ne m'a rien dit ? Faut t'il que j'en change ?


    Par contre mon Jeu de la vie ne marche toujours pas ( même après avoir enlevé les parenthèse ) , sans doute parce que j'ai fait n'importe quoi en écrivant les règles ^^. Si je ne trouves vraiment pas je reposterais un sujet.

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Pour le jeu de la vie, c'est du simple débogage (Mettez des printf, ou validez le comportement avec le débogueur )
    On peut aussi simplifier les tests, il me semble.

    Après, vous devriez afficher le "resultat" ça vous aidera.

    Pour le compilateur, il faut activer tous les niveaux d'avertissements. Sous GCC/G++, toujours compiler avec :
    -Wall -Wextra
    Sinon, il suffit de chercher dans les options du projet.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Bhon j'ai finis par trouvé merci LittleWhite, pour ton aide sans vous je ni serais jamais arrivé. Surtout que vos réponses était toujours très pertinente, Si jamais le code intéresse quelqu'un je le poste en dessous, pensez juste à faire 2 images vide.bmp et plein.bmp.

    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
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #include <iostream>
    #include <SDL/SDL.h>
    #include <ctime>
     
    using namespace std;
     
     
    int main ( int argc, char** argv )
    {
     
     
        int maxLargeur,maxHauteur;
     
        //Initialisation SDL
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
     
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
     
        SDL_Surface* screen,*imagePlein,*imageVide;
        SDL_Rect positionImage ;
     
     
        maxLargeur=SDL_GetVideoInfo()->current_w;
        maxHauteur=SDL_GetVideoInfo()->current_h;
     
        maxLargeur =500;
        maxHauteur =500;
     
        positionImage.x = 0;
        positionImage.y = 0;
     
        int maxX = maxHauteur/10;
        int maxY = maxLargeur/10;
        int grille[maxX][maxY];
        int alea = 0;
        srand(time(NULL));
        int j = 0;
     
        //Initialisation grille
        for(int i = 1; i < maxX; i++)
        {
            for(int j = 0; j < maxY; j++)
            {
     
                alea = rand() %(1-11);
     
     
                if(alea == 1)
                {
                    grille[i][j]=1;
                }
                else
                {
                    grille[i][j]=0;
                }
     
     
            }
        }
     
     
     
     
     
     
     
        // Création Fenêtre
     
    // | SDL_FULLSCREEN
     
        screen=SDL_SetVideoMode(maxLargeur, maxHauteur, 32, SDL_HWSURFACE |SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
     
     
     
        bool continuer = false;
     
        imagePlein = SDL_LoadBMP("plein.bmp");
        imageVide = SDL_LoadBMP("vide.bmp");
     
        // Gestion des erreurs, si problèmes on ferme tout
        if (!imagePlein)
        {
            fprintf( stderr,"Impossible de charger l'image : plein.bmp");
            exit(EXIT_FAILURE);
            continuer = true;
        }
        if (!imageVide)
        {
            fprintf( stderr,"Impossible de charger l'image : vide.bmp");
            exit(EXIT_FAILURE);
            continuer = true;
        }
     
        // Boucle principal
        while (!continuer)
        {
     
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    continuer = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = true;
                        break;
                    }
                }
            }
                int tempsActuel = SDL_GetTicks();
                int tempsPrecedent = 0;
                if (tempsActuel - tempsPrecedent > 30) /* Si 30 ms se sont écoulées */
                {
     
                    // Initialisation variable,
                    int resultat ;
     
                    // Affichage Map
                    for(int i = 1; i < maxX; i++)
                    {
                        for(int j = 0; j < maxY; j++)
                        {
                    if(grille[i-1][j-1]==1 && i!=0 )
                    {
                        resultat++;
                    }
                    if(grille[i-1][j]==1 && i!=0 )
                    {
                        resultat++;
                    }
     
                    if(grille[i-1][j+1]==1 && i!=0 && j!=maxX)
                    {
                        resultat++;
                    }
     
     
     
                    if(grille[i][j-1]==1 && j!=0)
                    {
                        resultat++;
                    }
                    if(grille[i][j+1]==1 && j!=maxX )
                    {
                        resultat++;
                    }
     
     
                    if(grille[i+1][j-1]==1 && i!=maxY && j!=0)
                    {
                        resultat++;
                    }
                    if(grille[i+1][j]==1 && i!=maxY && j!=maxX)
                    {
                        resultat++;
                    }
                    if(grille[i+1][j+1]==1 && i!=maxY && j!=maxX)
                    {
                        resultat++;
                    }
     
     
                    if(grille[i][j]==0 && resultat==3)
                    {
                        grille[i][j]=1;
                    }
                    else if(grille[i][j]==1 && resultat==2 or resultat==3)
                    {
                        grille[i][j]=1;
                    }
                    else
                    {
                        grille[i][j]=0;
                    }
     
     
                    resultat = 0;
     
     
                            if(grille[i][j]==0)
                            {
                                /* On blitte par-dessus l'écran */
                                SDL_BlitSurface(imageVide, NULL, screen, &positionImage);
                            }
                            else
                            {
                                SDL_BlitSurface(imagePlein, NULL, screen, &positionImage);
     
                            }
                            positionImage.x = positionImage.x +11;
     
                            //Affichage écran
                            SDL_Flip(screen);
     
                        }
     
                        positionImage.x = 0;
                        positionImage.y = positionImage.y +11;
     
     
                    }
     
     
                    positionImage.x = 0;
                    positionImage.y = 0;
     
     
                }
        }
                    //Vidage mémoire
                    SDL_FreeSurface(imagePlein);
                    SDL_FreeSurface(imageVide);
     
        return 0;
    }
    Et si jamais quelqu'un trouve un moyen d'accélérer la vitesse d'affichage je prends !

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    La vitesse d'affichage dépend intégralement de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tempsActuel = SDL_GetTicks();
                int tempsPrecedent = 0;
                if (tempsActuel - tempsPrecedent > 30) /* Si 30 ms se sont écoulées */
                {
    Donc vous pouvez l'améliorer vous même

    Pour éviter l'utilisation des images, j'avais fait ceci :
    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
    SDL_Rect dst;
    						dst.x = positionImage.x;
    						dst.y = positionImage.y;
    						dst.w = 11;
    						dst.h = 11;
     
     
                            if(grille[i][j]==0)
                            {
                                SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,196,32,32));
                            }
                            else
                            {
                                SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,32,32,196));
                            }
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci de ton aide, si je comprends bien tu blit un pixel plutôt qu'appliquer une image ? Est-ce que les performances sont sensiblement changé ou çà reste presque pareil ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Attention à l'indentation du code.

    Plutôt que de faire une case par trame, tu devrais faire toutes les cases à la fois, et passer par une grille temporaire afin de te baser sur l'état antérieur et non un mélange nouveau/ancien.

    Les lignes du style if(grille[i-1][j+1]==1 && i!=0 && j!=maxX) : la vérification de la condition n'est pas à la bonne place. Tu évalues d'abord la case, au risque de dépasser, puis, tu vérifies que l'on ne dépasse pas du tableau.
    Pour commencer, tu as des boucles du style for(int i = 1; i < maxX; i++) donc i ne sera jamais nul.
    Et ton programme devrait en principe planter sur les lignes où il y a un +1. N'oublie pas que l'on va de 0 à maxX-1 et pas maxX.

    La bonne méthode : on vérifie d'abord la condition sur l'indice, puis on y accède, en profitant de l'opérateur && qui n'évalue pas le second terme si le premier est faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(i!=0 && grille[i-1][j]) ...
    if(i<maxY-1 && grille[i+1][j]) ...
    etc.
    Je te conseille aussi de décomposer ton code et de petites fonctions.
    Et +1 LittleWhite pour les SDL_FillRect

    EDIT : N'oublie pas de libérer SDL_Surface* screen à la fin, ainsi que lors de l'échec de chargement des images (idem la première image si la seconde ne peut pas être chargée).
    Dernière modification par Invité ; 07/09/2014 à 17h21.

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Spiritus44 Voir le message
    Merci de ton aide, si je comprends bien tu blit un pixel plutôt qu'appliquer une image ? Est-ce que les performances sont sensiblement changé ou çà reste presque pareil ?
    Cela affiche un rectangle coloré, simplement.

    Pour les performances : http://alexandre-laurent.developpez....ces-de-la-SDL/
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    Expert confirmé
    Avatar de TiranusKBX
    Homme Profil pro
    Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Inscrit en
    Avril 2013
    Messages
    1 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 476
    Points : 4 805
    Points
    4 805
    Billets dans le blog
    6
    Par défaut
    ça évite surtout au programme de ré-envoyer l’intégralité de la surface à afficher
    Rien, je n'ai plus rien de pertinent à ajouter

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Oui concernant l'indentation du code ca devient un peu n'importe quoi a force de faire des copier coller de mon propre code, désolé de ce problème.

    Quand tu dis : "Plutôt que de faire une case par trame, tu devrais faire toutes les cases à la fois, et passer par une grille temporaire afin de te baser sur l'état antérieur et non un mélange nouveau/ancien."

    Mais comment je peux vérifier ou afficher l'état de toute les cases en même temps ? Le c++ est un langage linéaire, je ne devrait pas pouvoir tout vérifier en parallèle ?


    Les modifications faites :

    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
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #include <iostream>
    #include <SDL/SDL.h>
    #include <ctime>
     
    using namespace std;
     
     
    int main ( int argc, char** argv )
    {
     
     
        int maxLargeur,maxHauteur;
     
        //Initialisation SDL
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
     
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
     
        SDL_Surface* screen,*imagePlein,*imageVide;
        SDL_Rect positionImage ;
     
     
        maxLargeur=SDL_GetVideoInfo()->current_w;
        maxHauteur=SDL_GetVideoInfo()->current_h;
     
        positionImage.x = 0;
        positionImage.y = 0;
     
        int maxX = maxHauteur/10;
        int maxY = maxLargeur/10;
        int grille[maxX][maxY];
        int alea = 0;
        srand(time(NULL));
        int j = 0;
     
        //Initialisation grille
        for(int i = 1; i < maxX; i++)
        {
            for(int j = 0; j < maxY; j++)
            {
     
                alea = rand() %(1-20);
     
     
                if(alea == 1)
                {
                    grille[i][j]=1;
                }
                else
                {
                    grille[i][j]=0;
                }
     
     
            }
        }
     
     
     
     
     
     
     
        // Création Fenêtre
     
     
        screen=SDL_SetVideoMode(maxLargeur, maxHauteur, 32, SDL_HWSURFACE | SDL_FULLSCREEN |SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
     
     
     
        bool continuer = false;
     
        imagePlein = SDL_LoadBMP("plein.bmp");
        imageVide = SDL_LoadBMP("vide.bmp");
     
        // Gestion des erreurs, si problèmes on ferme tout
        if (!imagePlein)
        {
            fprintf( stderr,"Impossible de charger l'image : plein.bmp");
            exit(EXIT_FAILURE);
            continuer = true;
        }
        if (!imageVide)
        {
            fprintf( stderr,"Impossible de charger l'image : vide.bmp");
            exit(EXIT_FAILURE);
            continuer = true;
        }
     
        // Boucle principal
        while (!continuer)
        {
     
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    continuer = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = true;
                        break;
                    }
                }
            }
     
            // Initialisation variable,
            Uint32 tempsPrecedent = SDL_GetTicks();
     
     
            int resultat ;
     
            // Affichage Map
            for(int i = 1; i < maxX-1; i++)
            {
                for(int j = 0; j < maxY; j++)
                {
                    // Applications des règles du Jeu de la vie
     
                    if(i!=0 && grille[i-1][j-1]==1)
                    {
                        resultat++;
                    }
                    if( i!=0 && grille[i-1][j]==1)
                    {
                        resultat++;
                    }
     
                    if(grille[i-1][j+1]==1 && i!=0 && j!=maxX)
                    {
                        resultat++;
                    }
     
     
     
                    if(j!=0 && grille[i][j-1]==1 )
                    {
                        resultat++;
                    }
                    if(j!=maxX && grille[i][j+1]==1 )
                    {
                        resultat++;
                    }
     
     
                    if( j!=0 && grille[i+1][j-1]==1 && i!=maxY )
                    {
                        resultat++;
                    }
                    if(i!=maxY && j!=maxX && grille[i+1][j]==1 )
                    {
                        resultat++;
                    }
                    if(i!=maxY && j!=maxX && grille[i+1][j+1]==1 )
                    {
                        resultat++;
                    }
     
     
                    if(resultat==3 && grille[i][j]==0 )
                    {
                        grille[i][j]=1;
                    }
                    else if(resultat==2 or resultat==3 && grille[i][j]==1 )
                    {
                        grille[i][j]=1;
                    }
                    else
                    {
                        grille[i][j]=0;
                    }
     
     
                    resultat = 0;
     
     
                    if(grille[i][j]==0)
                    {
                        /* On blitte par-dessus l'écran */
                        SDL_BlitSurface(imageVide, NULL, screen, &positionImage);
                    }
                    else
                    {
                        SDL_BlitSurface(imagePlein, NULL, screen, &positionImage);
                    }
                    positionImage.x = positionImage.x +10;
     
                    //Affichage écran
                    SDL_Flip(screen);
     
                }
     
                        positionImage.x = 0;
                        positionImage.y = positionImage.y +10;
            }
     
     
            positionImage.x = 0;
            positionImage.y = 0;
     
     
     
            //  Attente si -30ms
            Uint32 tempsActuel = SDL_GetTicks();
     
     
            if (tempsActuel - tempsPrecedent < 30)
            {
                SDL_Delay(tempsActuel - tempsPrecedent);
            }
     
        }
     
        //Vidage mémoire
        SDL_FreeSurface(imagePlein);
        SDL_FreeSurface(imageVide);
     
        return 0;
    }

    Malheureusement, ces modifications ont entrainé un problèmes inexpliqué au niveau de la création de la grille, en effet maintenant le programme créer des sorte de structure qui se répète pas a l'identique mais à chaque démarrage de programme :

    Nom : 12.png
Affichages : 599
Taille : 288,5 Ko

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome
    Plutôt que de faire une case par trame, tu devrais faire toutes les cases à la fois
    Autant pour moi j'ai lu un peu trop vite ton code.

    Pour ce qui est des anciens/nouveaux états, actuellement tu n'utilises qu'un seul tableau.
    Ce qui fait que tu modifies ta première case (mettons qu'elle était à 0 et passe à 1), puis passes à la case suivante : ce qui inclus de vérifier l"état de la première... mais étant déjà modifiée, tu prends la nouvelle valeur 1, et pas l'ancienne 0.
    Avec deux tableaux, tu vérifies les valeurs de l'ancien tableau qui restent inchangées et mets à jour celles du nouveau.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Je vois ce que tu veux dire, mais cela veut dire que je dois faire 2 tableaux, un ancien et un nouveau. Mais comment mettre cela en place ? Je fais un tableau grille et grilleAncienne, quand j'initialise je met tout dans grilleAncienne, dans la boucle je fais mes calculs et je met le tout dans grille, j'affiche puis je refais 2 boucles pour dire que grilleAncienne=grille et ca recommence ? Si il y a une erreur de logique dites le moi. Mais en faisant çà, ca ne risque pas de ralentir encore plus le tout ?

  18. #18
    Invité
    Invité(e)
    Par défaut
    C'est bien ça, alors oui ça prend évidement un peu de ressources, mais c'est rien du tout

    Par contre ce qui te bouffe tout en ce moment c'est ton SDL_Flip(screen); au sein des deux boucles.
    Déplace cette ligne en dehors et tu verras que ça ira beaucoup mieux

    PS : ton code est un mélange affreux de C et C++

  19. #19
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Ok, je change la place du sdl_screen et oui je sais que c'est un mélange affreux de c/c++ mais je débute, et je ne connais pas les équivalents c/c++ donc je fais avec les moyens du bords ^^. Si tu connais les équivalence, je veux bien.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Bon, je penses avoir finis et grace a vos précieux conseil, tout fonctionne et ce très rapidement !

    Je poste le code au cas où quelqu'un en aurait besoin ( notez au passage que j'ai fait un effort pour l'indentation du code ).

    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
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #include <iostream>
    #include <SDL/SDL.h>
    #include <ctime>
     
    using namespace std;
     
     
    int main ( int argc, char** argv )
    {
     
     
        int maxLargeur,maxHauteur;
     
        //Initialisation SDL
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
     
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
     
        SDL_Surface* screen;
        SDL_Rect positionImage, dst ;
     
        maxLargeur=SDL_GetVideoInfo()->current_w;
        maxHauteur=SDL_GetVideoInfo()->current_h;
     
     
        positionImage.x = 0;
        positionImage.y = 0;
     
        int maxX = maxHauteur/10;
        int maxY = maxLargeur/10;
        int grille[maxX][maxY];
        int grilleAncienne[maxX][maxY];
        int alea = 0;
        srand(time(NULL));
        int j = 0;
     
        //Initialisation grille
        for(int i = 1; i < maxX; i++)
        {
            for(int j = 0; j < maxY; j++)
            {
     
                alea = rand() %(1-15);
     
     
                if(alea == 1)
                {
                    grilleAncienne[i][j]=1;
                }
                else
                {
                    grilleAncienne[i][j]=0;
                }
     
                grille[i][j]=0;
            }
        }
     
     
     
        // Création Fenêtre
     
        screen=SDL_SetVideoMode(maxLargeur, maxHauteur, 32, SDL_HWSURFACE | SDL_FULLSCREEN |SDL_DOUBLEBUF);
     
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
     
     
        bool continuer = false;
     
     
        int tempsPrecedent = 0;
        // Boucle principal
        while (!continuer)
        {
     
            Uint32 tempsPrecedent = SDL_GetTicks();
     
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
     
                switch (event.type)
                {
     
                case SDL_QUIT:
                    continuer = true;
                    break;
     
     
                case SDL_KEYDOWN:
                    {
     
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = true;
                        break;
                    }
                }
            }
     
     
            // Initialisation variable,
            int resultat ;
     
            // Affichage Map
     
            for(int i = 1; i < maxX; i++)
            {
                for(int j = 0; j < maxY; j++)
                {
                    //Calcul Cellule
                    if(grilleAncienne[i-1][j-1]==1 && i!=0 )
                    {
                        resultat++;
                    }
                    if(grilleAncienne[i-1][j]==1 && i!=0 )
                    {
                        resultat++;
                    }
     
                    if(grilleAncienne[i-1][j+1]==1 && i!=0 && j!=maxX)
                    {
                        resultat++;
                    }
     
     
     
                    if(grilleAncienne[i][j-1]==1 && j!=0)
                    {
                        resultat++;
                    }
                    if(grilleAncienne[i][j+1]==1 && j!=maxX )
                    {
                        resultat++;
                    }
     
     
                    if(grilleAncienne[i+1][j-1]==1 && i!=maxY && j!=0)
                    {
                        resultat++;
                    }
                    if(grilleAncienne[i+1][j]==1 && i!=maxY && j!=maxX)
                    {
                        resultat++;
                    }
                    if(grilleAncienne[i+1][j+1]==1 && i!=maxY && j!=maxX)
                    {
                        resultat++;
                    }
     
     
                    if(grilleAncienne[i][j]==0 && resultat==3)
                    {
                        grille[i][j]=1;
                    }
                    else if(grilleAncienne[i][j]==1 && resultat==2 or resultat==3)
                    {
                        grille[i][j]=1;
                    }
                    else
                    {
                        grille[i][j]=0;
                    }
     
     
                    resultat = 0;
     
                    dst.x = positionImage.x;
                    dst.y = positionImage.y;
                    dst.w = 10;
                    dst.h = 10;
     
                    if(grille[i][j]==0)
                    {
                        SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,255,255,255));
                    }
                    else
                    {
                        SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,196,32,32));
                    }
                    positionImage.x = positionImage.x +10;
     
     
     
                }
     
                positionImage.x = 0;
                positionImage.y = positionImage.y +10;
     
     
            }
     
            //Affichage écran
            SDL_Flip(screen);
            positionImage.x = 0;
            positionImage.y = 0;
     
            //Changement grille->grilleAncienne
     
            for(int i = 1; i < maxX; i++)
            {
                for(int j = 0; j < maxY; j++)
                {
                    grilleAncienne[i][j]=grille[i][j];
                }
            }
     
            Uint32 tempsActuel = SDL_GetTicks();
     
            if (tempsActuel - tempsPrecedent < 1000)
            {
                SDL_Delay(150);
            }
        }
        return 0;
    }
    Merci de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème jeu de la vie de Wolfram
    Par romromp dans le forum Pascal
    Réponses: 14
    Dernier message: 11/03/2007, 19h58
  2. algorithme d'évolution du "jeu de la vie" en caml
    Par nono88 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/12/2006, 00h56
  3. Conway's life (jeu de la vie) pour images
    Par O( N ) dans le forum C
    Réponses: 1
    Dernier message: 26/09/2006, 02h13
  4. [Conception] Jeu de la vie
    Par deuscapser dans le forum Général Java
    Réponses: 16
    Dernier message: 09/03/2006, 12h47
  5. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 20h06

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