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 :

SDL: Faire apparaître plusieurs voitures à la suite


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut SDL: Faire apparaître plusieurs voitures à la suite
    Bonjour à tous !

    Jeu: Tous les voitures (Car + Taxi) vont dans le même sens, mais si on accélère il faut donc éviter les taxis qui foncent vers nous, plus on tient dans le temps et plus on esquive de taxi, plus on aura de point.

    J'essaye dont depuis un long moment de faire apparaître des taxis à la suite. J'y arrive pas ...
    J'ai aussi d'autres problème :
    - J'ai un problème au niveau des directions quand j'appuie par exemple sur gauche, normalement quand je relâche la touche la voiture est sensé s'arrêter or ici la voiture continue sa trajectoire.
    - La souris fait aussi bouger ma voiture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
     #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <time.h>
    //constantes
    #define LARGEUR_FENETRE 640
    #define HAUTEUR_FENETRE 480
    #define VITESSE 5
     
     
    //alias
    typedef struct objet objet;
    typedef enum direction direction;
     
    //structures et énumérations
    enum direction
    {
        DROITE,GAUCHE,BAS,HAUT
    };
     
    struct objet
    {
        long positionx_Car;
        long positiony_Car;
        long taillex_Car;
        long tailley_Car;
     
        long positionx_Taxi;
        long positiony_Taxi;
        long taillex_Taxi;
        long tailley_Taxi;
     
        direction sens;
    };
     
    //Prototypage 
    void deplacement(objet *source);
    objet initobjet(objet retour1, SDL_Surface *image2, SDL_Surface *ecran);
     
     
    //Main fonction
    int main(int argc, char *argv[])
    {
        //initialisation des variables
        SDL_Surface *ecran = NULL, *car = NULL, *taxi = NULL, *map=NULL;
        SDL_Rect positionCar, positionTaxi, positionMap;
        objet CarTaxi;
        SDL_Event event;
        int continuer = 1, tempsPrecedent = 0, tempsActuel = 0;
        SDL_TimerID timer;
     
        // Initialisation du générateur de nombre aléatoires
        srand(time(NULL));
     
        // Initialisation de SDL avec Gestion d'erreurs
        if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL");
            exit(EXIT_FAILURE);
        }
     
        // Chargement de l'icône de la barre de fenêtre AVANT SDL_SetVideoMode
        SDL_WM_SetIcon(IMG_Load("route.png"), NULL);
     
        // initialisation de la fenêtre avec les constante défini dans le préprocesseur
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_INIT_TIMER);
     
        //petite vérification de la fenêtre
        if ( ecran == NULL )
        {
            fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
     
        // On ajoute un titre
        SDL_WM_SetCaption("Gestion du temps en SDL", NULL);
     
            // on charge la route
        map = IMG_Load("route.png");
     
        // on fixe la position
        positionMap.x = 0;
        positionMap.y = 0;
     
        // on charge car
        car =  IMG_Load("car.png");
     
        // position par défaut de car
        CarTaxi.positionx_Car = 183;
        CarTaxi.positiony_Car = 330;
     
        //taille car
        CarTaxi.taillex_Car = car->w;
        CarTaxi.tailley_Car = car->h;
     
        // on configure l'affichage de car
        SDL_SetColorKey(car, SDL_SRCCOLORKEY, SDL_MapRGB(car->format, 0, 0, 255));
     
        // on charge le taxi
        taxi = IMG_Load("taxi.png");
     
        //initialisation
        CarTaxi = initobjet(CarTaxi, taxi, ecran);
     
        // On autorise la répétition de touches
        SDL_EnableKeyRepeat(10, 10);
     
     
        //Boucle infini (enfin presque...)
        while(continuer)
        {
            // On regarde si il y'a un événement, mais on ne bloque pas le programme
       while (SDL_PollEvent(&event)) // correct
            {  
            // Si il y'a un évènement SDL, on le traite
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN :
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Appui sur la touche Echap, on arrête le programme
                            continuer = 0;
                            break;
                        case SDLK_UP : // Flèche haut
                            CarTaxi.sens = HAUT;
                            break;
                        case SDLK_DOWN : // Flèche bas
                            CarTaxi.sens = BAS;
                            break;
                        case SDLK_RIGHT : // Flèche droite
                            CarTaxi.sens = DROITE;
                            break;
                        case SDLK_LEFT : // Flèche gauche
                            CarTaxi.sens = GAUCHE;
                            break;
                        default :
                            break;
                    }
                default :
                    break;
            }
    } 
            // On initialise temps actuel pour savoir depuis quand le programme tourne
            tempsActuel = SDL_GetTicks();
     
            if (tempsActuel - tempsPrecedent > VITESSE) // Si 30 ms se sont écoulées depuis le dernier test
            {
                //déplacement
                deplacement(&CarTaxi);
     
                tempsPrecedent = tempsActuel; // Le temps "actuel" devient le temps "precedent" pour nos futurs calculs
            }
            else // Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut
            {
                SDL_Delay(VITESSE - (tempsActuel - tempsPrecedent));
            }
     
            //gestion de colision
     
     
            //report des coordonées
            positionCar.x = CarTaxi.positionx_Car;
            positionCar.y = CarTaxi.positiony_Car;
            positionTaxi.x = CarTaxi.positionx_Taxi;
            positionTaxi.y = CarTaxi.positiony_Taxi;
     
            // on refait l'affichage avec les nouveau paramêtres
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(map, NULL, ecran, &positionMap);
            SDL_BlitSurface(car, NULL, ecran, &positionCar);
            SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
            // on affiche le tout en premier plan
            SDL_Flip(ecran);
        }
     
        // libération de la mémoire
        SDL_FreeSurface(car);
        SDL_FreeSurface(taxi);
     
        // Libération du timer
        SDL_RemoveTimer(timer);
     
        // Fermeture de sdl et fin
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
     
     
     
    // Gestion du déplacement et de la colision avec les bords de la fenêtre
    void deplacement(objet *source)
    {
        //Déclaration des variables
        objet *position = source;
     
        switch(position->sens)
        {
            case DROITE :
                position->positionx_Car+=1; // On bouge car vers la droite
                // Si position car.x + largeur car dépasse la fenêtre
                if ((position->positionx_Car) > 315)
                {
                    // on change de sens et on bouge car vers la gauche
                    position->positionx_Car=315; 
     
                }
                break;
            case GAUCHE :
                position->positionx_Car-=1; // On bouge car vers la droite
                // Si position car.x + largeur car dépasse la fenêtre
                if ((position->positionx_Car) < 55)
                {
                    // on change de sens et on bouge car vers la gauche
                    position->positionx_Car=55; 
     
                }
     
                break;
            case BAS :
                position->positiony_Car+=1; // On bouge car vers la droite
                // Si position car.x + largeur car dépasse la fenêtre
                if ((position->positiony_Car) > 330)
                {
                    // on change de sens et on bouge car vers la gauche
                    position->positiony_Car=330; 
     
                }
                break;
            case HAUT :
                position->positiony_Car-=1; // On bouge car vers la droite
                // Si position car.x + largeur car dépasse la fenêtre
                if ((position->positiony_Car) < 280)
                {
                    // on change de sens et on bouge car vers la gauche
                    position->positiony_Car=280; 
     
                }
                break;
            default :
                break;
        }
     
    }
     
     
     
     
    objet initobjet(objet retour1, SDL_Surface *image2, SDL_Surface *ecran)
    {
        int nombre_aleatoire = rand()%9;
     
        //taille taxi
        retour1.taillex_Taxi = image2->w;
        retour1.tailley_Taxi = image2->h;
     
        // position par défaut de taxi, endehors de l'écran
        retour1.positiony_Taxi= 0;
     
        switch(nombre_aleatoire){
            case 0:
                retour1.positionx_Taxi=60;
     
                break;
            case 1:
                retour1.positionx_Taxi=90;
     
                break;
            case 2:
                retour1.positionx_Taxi=110;
     
                break;
            case 3:
                retour1.positionx_Taxi=150;
     
                break;
            case 4:
                retour1.positionx_Taxi=210;
     
                break;
            case 5:
                retour1.positionx_Taxi=250;
     
                break;
            case 6:
                retour1.positionx_Taxi=290;
     
                break;
            case 7:
                retour1.positionx_Taxi=300;
     
                break;
            case 8:
                retour1.positionx_Taxi=310;
     
                break;
        }
     
        // on renvoie le tout
        return retour1;
     
    }
    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Evènement ou etat ?
    Bonjour,

    D'après le code les flèches permettent de changer le sens mais il est normal que la voiture continue à avancer dans l'un des sens puisque l'on appelle systématiquement la fonction déplacement.
    Si on veut que la voiture ne se déplace que lorsque la touche est appuyée, il faut le faire en fonction de l'état de la touche et pas uniquement en fonction de l'évènement "KEYDOWN" !
    Il est possible par exemple de gérer un booléen "mouvement" mis à "1" à chaque "KEYDOWN" et remis à zéro à chaque "KEYUP".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Ta structure objet regroupe les voitures (Car ?) et les taxis ? Ce sont des voitures donc tu n'as besoin que d'une structure et il ne faut pas suffixer tes attributs. Ça va vraiment éclaircir ton code et c'est juste plus logique ! En plus j'ai fini par contre que c'était des sprites.

    Enfin pour gérer plusieurs taxis il te faudrait utiliser des tableaux. Déjà est-ce qu'un taxi s'affiche correctement ?

    Sinon attention dans ta fonction initobjet comment tu passes les données et retourne une structure. Pas besoin de retourner retour1 si tu le modifies mais alors il faudrait que ça soit un pointeur comme les structures SDL. En plus tu sembles mélanger les voitures et leurs images. D'où mon conseil au début !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai une idée de:

    - Créer un tableau unidimensionnelle (chaque case correspond à la une route d’apparition du taxi)
    Exemple 3 voies: positionx_taxi=0, positionx_taxi=100, positionx_taxi=150
    - Lorsqu'un taxi apparaît, cette case est occupé mais les deux autres sont libre.
    - Si la distance entre la première apparition est supérieure à 200 (positiony_taxi>200) alors sur une des deux cases apparaît un taxi.
    - Une variable va à chaque fin de boucle vérifier si sur une voie est prise ou pas.
    Comment je pourrais modifier cette fonction pour qu'il puisse effectuer ces tâches ?

    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
    objet initobjet(objet retour1, SDL_Surface *image2, SDL_Surface *ecran)
    {
        srand(time(NULL));
        const int MIN = 0, MAX = 4;
        int nombre_aleatoire = 0;
     
        //taille taxi
        retour1.taillex_Taxi = image2->w;
        retour1.tailley_Taxi = image2->h;
     
        // Nombre compris entre 0 à 4
        nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
        // Affiche la position du Taxi sur la route
        printf("La voiture est apparue à la position n°%d de la route\n\n", nombre_aleatoire);
     
        // Position d'apparition du Taxi
        retour1.positiony_Taxi= 0;
        retour1.positionx_Taxi = nombre_aleatoire*65 + 54;
     
        // on renvoie le tout
        return retour1;
     
    }
    Et je l'appelle comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // initialisation
    CarTaxi = initobjet(CarTaxi, taxi, ecran);
    Sachant que je dois rendre ce projet dans les jours à venir, je vous prie de bien vouloir m'aider du mieux que vous pouvez s'il vous plait. Merci bien !

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    j'ai jeté un coup d'oeil au code rapidement oui il faut gérer l'événement KEYUP comme l'explique nanosoft

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai réussi a modifier le programme avec 2 structures comme vous m'avez demandé.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Pour gérer tes taxis avec un tableau il faudrait que retour1 devienne un pointeur. Ensuite faut utiliser nombre_aleatoire comme index. Au moins ça t'obligera à arrêter de le passer comme paramètre à ta fonction et de le retourner inutilement.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par vinoth Voir le message
    J'ai réussi a modifier le programme avec 2 structures comme vous m'avez demandé.
    Pour séparer les voitures de leur images ? Qu'un taxi soit une voiture comme une autre ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Comment feriez-vous un tableau en SDL (si possible m'envoyer un lien de cours/d'exemple)

    Voici ce que j'ai changé:


    constante.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #ifndef CONSTANTES_H_INCLUDED
    #define CONSTANTES_H_INCLUDED
     
    //constantes
    #define LARGEUR_FENETRE 640
    #define HAUTEUR_FENETRE 480
    #define VITESSE 5
     
    //alias
    typedef struct Car Car;
    typedef struct Taxi Taxi;
    typedef enum direction direction;
    //typedef Vecteur* Matrice;
     
    //structures et énumérations
    enum direction
    {
        DROITE,GAUCHE,BAS,HAUT
    };
     
    struct Car
    {
        long positionx_Car;
        long positiony_Car;
        long taillex_Car;
        long tailley_Car;
     
        direction sens;
    };
     
    struct Taxi
    {
        long positionx_Taxi;
        long positiony_Taxi;
        long taillex_Taxi;
        long tailley_Taxi;
    };
     
     
     
    #endif // CONSTANTES_H_INCLUDED

    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <time.h>
    //header perso
    #include "constantes.h"
    #include "affichage_taxi.h"
    #include "traitement.h"
     
    //Prototypage 
    Taxi initobjet(Taxi retour1, SDL_Surface *image, SDL_Surface *ecran);
     
     
    //Main fonction
    int main(int argc, char *argv[])
    {
        //initialisation des variables
        SDL_Surface *ecran = NULL, *car = NULL, *taxi = NULL, *map=NULL;
        SDL_Rect positionCar, positionTaxi, positionMap;
        Car Car;
        Taxi Taxi;
        SDL_Event event;
        int continuer = 1, tempsPrecedent = 0, tempsActuel = 0;
        int gameover;
        int n = 1;
        int m = 80;
     
        int tab[] = {0,0,0};
     
        // Initialisation du générateur de nombre aléatoires
        srand(time(NULL));
     
        // Initialisation de SDL avec Gestion d'erreurs
        if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL");
            exit(EXIT_FAILURE);
        }
     
        // Chargement de l'icône de la barre de fenêtre AVANT SDL_SetVideoMode
        SDL_WM_SetIcon(IMG_Load("images/route.png"), NULL);
     
        // initialisation de la fenêtre avec les constante défini dans le préprocesseur
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
        //petite vérification de la fenêtre
        if ( ecran == NULL )
        {
            fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
     
        // On ajoute un titre
        SDL_WM_SetCaption("Gestion du temps en SDL", NULL);
     
            // on charge la route
        map = IMG_Load("images/route.png");
     
        // on fixe la position
        positionMap.x = 0;
        positionMap.y = 0;
     
        // on charge car
        car =  IMG_Load("images/car.png");
     
        // position par défaut de car
        Car.positionx_Car = 173;
        Car.positiony_Car = 400;
     
        // taille car
        Car.taillex_Car = car->w;
        Car.tailley_Car = car->h;
     
        // on configure l'affichage de car
        SDL_SetColorKey(car, SDL_SRCCOLORKEY, SDL_MapRGB(car->format, 0, 0, 255));
     
        // on charge le taxi
        taxi = IMG_Load("images/taxi.png");
     
        // initialisation
        Taxi = initobjet(Taxi, taxi, ecran);
     
        // On autorise la répétition de touches
        SDL_EnableKeyRepeat(10, 10);
     
     
        //Boucle infini 
        while(continuer)
        {
        // On regarde si il y'a un événement, mais on ne bloque pas le programme
        SDL_PollEvent(&event);
            // Si il y'a un évènement SDL, on le traite
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
     
                case SDL_KEYDOWN :
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Appui sur la touche Echap, on arrête le programme
                            continuer = 0;
                            break;
                        case SDLK_UP : // Flèche haut
                            Car.sens = HAUT;
                            break;
                        case SDLK_DOWN : // Flèche bas
                            Car.sens = BAS;
                            break;
                        case SDLK_RIGHT : // Flèche droite
                            Car.sens = DROITE;
                            break;
                        case SDLK_LEFT : // Flèche gauche
                            Car.sens = GAUCHE;
                            break;
                    }
     
                case SDL_KEYUP :
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Appui sur la touche Echap, on arrête le programme
                            continuer = 0;
                            break;
                        case SDLK_UP : // Flèche haut
                            Car.sens = HAUT;
                            break;
                        case SDLK_DOWN : // Flèche bas
                            Car.sens = BAS;
                            break;
                        case SDLK_RIGHT : // Flèche droite
                            Car.sens = DROITE;
                            break;
                        case SDLK_LEFT : // Flèche gauche
                            Car.sens = GAUCHE;
                            break;
                    }
                 break;
            }
     
            // On initialise temps actuel pour savoir depuis quand le programme tourne
            tempsActuel = SDL_GetTicks();
     
            // Déclaration de la variable temps_sec_ecoule
            int temps_sec_ecoule;
            temps_sec_ecoule=SDL_GetTicks()/1000; // Conversion du temps en seconde
     
     
            if (tempsActuel - tempsPrecedent > VITESSE) // Si 30 ms se sont écoulées depuis le dernier test
            {
                //déplacement
                deplacement(&Car);
     
     
     
                tempsPrecedent = tempsActuel; // Le temps "actuel" devient le temps "precedent" pour nos futurs calculs
            }
            else // Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut
            {
                SDL_Delay(VITESSE - (tempsActuel - tempsPrecedent));
            }
     
     
          //gestion de colision et fin de la partie
        if(Car.positionx_Car <= Taxi.positionx_Taxi+10 && Car.positionx_Car >= Taxi.positionx_Taxi-10 && Car.positiony_Car <= Taxi.positiony_Taxi+10 && Car.positiony_Car >= Taxi.positiony_Taxi-10 )
          {
             gameover=1;
             continuer=0;
     
            if(gameover==1){
               int temps_sec_ecoule;
                temps_sec_ecoule=SDL_GetTicks()/1000;
     
                    if(temps_sec_ecoule%1 == 0){
                    printf("<< Game Over >> | Temps de jeu total: %d secondes \n",temps_sec_ecoule);
                   break;
                  }
     
            }
          } 
     
     
     
        srand(time(NULL));
        const int MIN = 0, MAX = 3;
        int nombre_aleatoire = 0;
     
     
        // Nombre compris entre 0 à 3
        nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
        int ag=nombre_aleatoire;
     
                   if(Taxi.positiony_Taxi>= 500){
                    if(ag == 1 ){
                         Taxi.positionx_Taxi = 60;
                         Taxi.positiony_Taxi = 0;
                         Taxi.positiony_Taxi+=1;
                         SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);   
                         SDL_Flip(ecran);
                    }else if(ag == 2){
                         Taxi.positionx_Taxi = 173;
                         Taxi.positiony_Taxi = 0;
                         Taxi.positiony_Taxi+=1;
                         SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
                         SDL_Flip(ecran);
                    }else{
                         Taxi.positionx_Taxi = 200;
                         Taxi.positiony_Taxi = 0;
                         Taxi.positiony_Taxi+=1;
                         SDL_Flip(ecran);
                         SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
                    }
            }
     
     
            //report des coordonées
            positionCar.x = Car.positionx_Car;
            positionCar.y = Car.positiony_Car;
            positionTaxi.x = Taxi.positionx_Taxi;
            positionTaxi.y = Taxi.positiony_Taxi;
     
            // on refait l'affichage avec les nouveau paramêtres
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            SDL_BlitSurface(map, NULL, ecran, &positionMap);
     
            //SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
            // on affiche le tout en premier plan
            SDL_BlitSurface(car, NULL, ecran, &positionCar);
            // on affiche le tout en premier plan
            SDL_Flip(ecran);
        }
     
        // libération de la mémoire
        SDL_FreeSurface(car);
        SDL_FreeSurface(taxi);
        SDL_FreeSurface(ecran);
     
        // Fermeture de sdl et fin
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
     
     
     
     
    Taxi initobjet(Taxi retour1, SDL_Surface *image, SDL_Surface *ecran)
    {
        srand(time(NULL));
        const int MIN = 0, MAX = 3;
        int nombre_aleatoire = 0;
     
        //taille taxi
        retour1.taillex_Taxi = image->w;
        retour1.tailley_Taxi = image->h;
     
        // Nombre compris entre 0 à 3
        nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
        // Affiche la position du Taxi sur la route 
        printf("La voiture est apparue à la position n°%d de la route\n\n", nombre_aleatoire); 
     
        // Position d'apparition du Taxi
        retour1.positiony_Taxi= 0;
        retour1.positionx_Taxi = nombre_aleatoire*65 + 54;
     
        // on renvoie le tout
        return retour1;
     
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut Tableaux, amélioration et tests
    Un tableau SDL ? Faut pas confondre la bibliothèque multimédia avec le langage C. Tu parlais d'en utiliser un avec une dimension. Vous avez étudié les tableaux en cours ? Comment aurais-tu procéder par exemple pour gérer tes 3 routes ou les taxis ? Pour t'aider je te conseille les FAQs, notamment sur les tableaux et pointeurs, et pour les cours il y en a plusieurs que je ne connais pas. Tu peux rapidement comparer leurs sommaires et voir celui correspondant le plus à ton besoin.

    Sinon c'est bien d'avoir amélioré ton code et en progressant tu trouveras même plein d'idées par toi-même pour le simplifier, le rendre plus lisible… De quoi se motiver ! Par exemple faut pas hésiter à utiliser des noms un peu plus longues afin de bien différencier 2 variables. Mais au moins tes nombreux commentaires aident à mieux se repérer.

    Astuce : Pour tester les tableaux ou juste une idée n'hésite pas à créer de nouveaux projets et partir de zéro dans d'autres dossiers. C'est le principe du bac à sable ou expérimente, s'amuse… Tu oublies SDL, car l'affichage ça peut être juste du texte au final, et ton code relativement complexe pour te focaliser sur le plus important. Ça évite d'être confus par le reste (Gestion du clavier, initialisation des images…). Ensuite une fois que ton test est concluant et que tu as mieux compris les choses tu peux revenir à ton projet.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai vraiment tout essayé, j'ai passé 15heures d'affilé (libre à vous de me croire). J'ai toujours pas résolue ce putain de problè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
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <time.h>
    #include <SDL/SDL_ttf.h>
    #include <string.h>
    //header perso
    #include "constantes.h"
    #include "affichage_taxi.h"
    #include "traitement.h"
    //#include "menu.h"
     
    //Prototypage 
    //int pos_aleatoire(retour1);
    void jouer();
    void affiche(int *tableau, int tailleTableau);
    int valeur_random(int valeur);
     
    //Main fonction
    int main(int argc, char *argv[])
    {
    	//	affichage();
    	jouer();
    	SDL_Quit();
     
    	return EXIT_SUCCESS;
    }
     
     
    void jouer(){
    	//initialisation des variables
    	SDL_Surface *ecran;
    	SDL_Surface *car = NULL, *taxi = NULL, *taxi2 = NULL, *taxi3 = NULL, *map=NULL, *texte1=NULL;
    	SDL_Rect positionCar, positionTaxi, positionTaxi2, positionTaxi3, positionMap, positiontxt1;
    	int tempsPrecedent = 0, tempsActuel = 0;
    	Car Car;
    	Taxi Taxi;
    	Taxi2 Taxi2;
    	Taxi3 Taxi3;
    	SDL_Event event;
    	int continue1;
    	int gameover;
    	TTF_Font *police = NULL;
    	int a = 0, p = 0;
    	// char temps[20] = "";
    	char temps2[20] = "";
    	int compteur = 0;
    	SDL_Color couleurNoire = {0,0,0};
    	SDL_Surface *fond = NULL;
    	//SDL_Surface *texte = NULL, 
    	SDL_Rect position;
    	int continuer = 1;
     
    	int tableau[3]={0, 0, 0}, k;
     
     
    	TTF_Init();
     
    	// Initialisation du générateur de nombre aléatoires
    	srand(time(NULL));
     
    	// Initialisation de SDL avec Gestion d'erreurs
    	if (SDL_Init(SDL_INIT_VIDEO) == -1)
    	{
    		fprintf(stderr, "Erreur d'initialisation de la SDL");
    		exit(EXIT_FAILURE);
    	}
     
     
    	// Chargement de l'icône de la barre de fenêtre AVANT SDL_SetVideoMode
    	SDL_WM_SetIcon(IMG_Load("images/route.png"), NULL);
     
    	// initialisation de la fenêtre avec les constante défini dans le préprocesseur
    	ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
    	//petite vérification de la fenêtre
    	if ( ecran == NULL )
    	{
    		fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
    		exit(EXIT_FAILURE);
    	}
     
    	// On ajoute un titre
    	SDL_WM_SetCaption("Gestion du temps en SDL", NULL);
     
    	// on charge la route
    	map = IMG_Load("images/route.png");
     
    	// on fixe la position
    	positionMap.x = 0;
    	positionMap.y = 0;
     
    	// on charge car
    	car =  IMG_Load("images/car.png");
     
    	// position par défaut de car
    	Car.positionx_Car = 173;
    	Car.positiony_Car = 400;
     
    	// taille car
    	Car.taillex_Car = car->w;
    	Car.tailley_Car = car->h;
     
    	// on configure l'affichage de car
    	SDL_SetColorKey(car, SDL_SRCCOLORKEY, SDL_MapRGB(car->format, 0, 0, 255));
     
    	// on charge le taxi
    	taxi = IMG_Load("images/taxi.png");
    	taxi2 = IMG_Load("images/taxi.png");
    	taxi3 = IMG_Load("images/taxi.png");
     
    	//taille taxi
    	Taxi.taillex_Taxi = taxi->w;
    	Taxi.tailley_Taxi = taxi->h;
    	//taille taxi
    	Taxi2.taillex_Taxi2 = taxi2->w;
    	Taxi2.tailley_Taxi2 = taxi2->h;
    	//taille taxi
    	Taxi3.taillex_Taxi3 = taxi3->w;
    	Taxi3.tailley_Taxi3 = taxi3->h;
     
    	/* initialisation
    	Taxi = pos_aleatoire(Taxi);
    	Taxi2 = pos_aleatoire(Taxi2);
    	Taxi3 = pos_aleatoire(Taxi3);
    	*/
     
    	/* Chargement de la police */
    	police = TTF_OpenFont("fonts/OptimusPrincepsSemiBold.ttf", 14);
     
    	//Position texte1
    	positiontxt1.x=420;
    	positiontxt1.y=10;
     
    	// Déclaration de la variable temps_sec_ecoule
    	int temps_sec_ecoule;
    	temps_sec_ecoule=SDL_GetTicks()/1000; // Conversion du temps en seconde
    	compteur=temps_sec_ecoule;
     
     
    	// On autorise la répétition de touches
    	SDL_EnableKeyRepeat(10, 10);
     
     
     
    	/* Écriture du texte dans la SDL_Surface texte en mode Blended (optimal) */
    	// texte = TTF_RenderText_Blended(police, "Salut les Zér0s %d!", couleurNoire);
     
    	//position.x = 60;
    	//position.y = 370;
     
    	//       sprintf(temps2, "Score : %d", compteur);
    	//     texte1 = TTF_RenderText_Blended(police, temps2, couleurNoire);
     
     
    	//Boucle infini 
    	while(continue1)
    	{
    		// On regarde si il y'a un événement, mais on ne bloque pas le programme
    		while (SDL_PollEvent(&event)) // correct
    		{  
     
    			// Si il y'a un évènement SDL, on le traite
    					switch(event.type)
    			{
    				case SDL_QUIT:
    					continue1 = 0;
    					break;
    				case SDL_KEYDOWN :
    					switch(event.key.keysym.sym)
    					{
    						case SDLK_ESCAPE: // Appui sur la touche Echap, on arrête le programme
    							continue1 = 0;
    							break;
    						case SDLK_UP : // Flèche haut
    							Car.sens = HAUT;
    						Car.positiony_Car-=5;
    							break;
    						case SDLK_DOWN : // Flèche bas
    						Car.positiony_Car+=5;
    							Car.sens = BAS;
    							break;
    						case SDLK_RIGHT : // Flèche droite
    						Car.positionx_Car+=5;
    							Car.sens = DROITE;
    							break;
    						case SDLK_LEFT : // Flèche gauche
    						Car.positionx_Car-=5;
    							Car.sens = GAUCHE;
    							break;
    						default:
    							break;
    					}
    					break;
    			}
     
    			deplacement(&Car);
    		}
     
     
    		compteur=compteur+1;
    		if (compteur%100 == 0)
    		{
    			a=a+5;
     
    			sprintf(temps2, "Score : %d", a);
    			SDL_BlitSurface(texte1, NULL, ecran, &positiontxt1); 
    			SDL_FreeSurface(texte1);
    			texte1 = TTF_RenderText_Blended(police, temps2, couleurNoire);
    		}
    		if (tempsActuel - tempsPrecedent > VITESSE) // Si 30 ms se sont écoulées depuis le dernier test
    		{
     
     
    			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(VITESSE - (tempsActuel - tempsPrecedent));
    		}
     
     
     
     
    		//gestion de colision et fin de la partie
    		if(	Car.positionx_Car <= Taxi3.positionx_Taxi3+50 && Car.positionx_Car >= Taxi3.positionx_Taxi3-50 && Car.positiony_Car <= Taxi3.positiony_Taxi3+127 && Car.positiony_Car >= Taxi3.positiony_Taxi3-127 || Car.positionx_Car <= Taxi2.positionx_Taxi2+50 && Car.positionx_Car >= Taxi2.positionx_Taxi2-50 && Car.positiony_Car <= Taxi2.positiony_Taxi2+127 && Car.positiony_Car >= Taxi2.positiony_Taxi2-127 || Car.positionx_Car <= Taxi.positionx_Taxi+50 && Car.positionx_Car >= Taxi.positionx_Taxi-50 && Car.positiony_Car <= Taxi.positiony_Taxi+127 && Car.positiony_Car >= Taxi.positiony_Taxi-127)
    		{
    			gameover=1;
    			continue1=0;
     
    			if(gameover==1){
    				int temps_sec_ecoule;
    				temps_sec_ecoule=SDL_GetTicks()/1000;
     
    				if(temps_sec_ecoule%1 == 0){
    					printf("<< Game Over >> | Temps de jeu total: %d secondes \n",temps_sec_ecoule);
    					break;
    				}
     
    			}
    		} 
     
     
    		Taxi.positionx_Taxi = 85;
    		Taxi2.positionx_Taxi2 = 190;
    		Taxi3.positionx_Taxi3 = 295;
     
    		Taxi.positiony_Taxi--;
    		Taxi2.positiony_Taxi2--;
    		Taxi3.positiony_Taxi3--;
     
    ///////////////////////////
     
     
           if (event.type == SDL_KEYDOWN)
           {
     
               if (Car.sens == HAUT && DROITE || Car.sens == HAUT && GAUCHE || Car.sens == HAUT)
               {
    								Taxi.positiony_Taxi=Taxi.positiony_Taxi+3;
    								Taxi2.positiony_Taxi2=Taxi2.positiony_Taxi2+3;
    								Taxi3.positiony_Taxi3=Taxi3.positiony_Taxi3+3;
               }
     
               if (Car.sens == BAS && DROITE || Car.sens == BAS && GAUCHE || Car.sens == BAS)
               {
    								Taxi.positiony_Taxi=Taxi.positiony_Taxi-4;
    								Taxi2.positiony_Taxi2=Taxi2.positiony_Taxi2-4;
    								Taxi3.positiony_Taxi3=Taxi3.positiony_Taxi3-4;
               }
     
           }
     
     ///////////////////////////
     
    		//report des coordonées Car
    		positionCar.x = Car.positionx_Car;
    		positionCar.y = Car.positiony_Car;
     
    		//report des coordonées Taxi
    		positionTaxi.x = Taxi.positionx_Taxi;
    		positionTaxi.y = Taxi.positiony_Taxi;
     
    		//report des coordonées Taxi2
    		positionTaxi2.x = Taxi2.positionx_Taxi2;
    		positionTaxi2.y = Taxi2.positiony_Taxi2;
     
    		//report des coordonées Taxi3
    		positionTaxi3.x = Taxi3.positionx_Taxi3;
    		positionTaxi3.y = Taxi3.positiony_Taxi3;
     
    		// on refait l'affichage avec les nouveau paramêtres
    		SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
    		SDL_BlitSurface(map, NULL, ecran, &positionMap);
    		//SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
    		// SDL_BlitSurface(texte1, NULL, ecran, &positiontxt1);
    		// on affiche le tout en premier plan
    		SDL_BlitSurface(car, NULL, ecran, &positionCar);
     
    		SDL_BlitSurface(texte1, NULL, ecran, &positiontxt1); 
     
    		//SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte */
     
     
    	// srand(time(NULL));
    	// const int MIN = 0, MAX = 2;
    	// int nombre_aleatoire = 0;
    	// int A=0;
     
    	// // Nombre compris entre 0 à 3
    	// nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
    	// // Position d'apparition du Taxi
    		int A;
     
    		A = valeur_random(k);
     
     
    switch(A){
     
    	case 85:
    		tableau[0] = 1;
    		tableau[1] = 0;
    		tableau[2] = 0;
     
    			while (Taxi.positiony_Taxi<533)
    			{
    				SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
    				Taxi2.positiony_Taxi2=0;
    				Taxi3.positiony_Taxi3=0;
    				A = 0;
    			}
    	break;
    	case 190:
    		tableau[0] = 0;
    		tableau[1] = 1;
    		tableau[2] = 0;
     
     
    			while (Taxi2.positiony_Taxi2<533)
    			{	
    				SDL_BlitSurface(taxi2, NULL, ecran, &positionTaxi2);
    				Taxi3.positiony_Taxi3=0;
    				Taxi.positiony_Taxi=0;
    				A = 0;
    			}
    	break;
    	case 295:
    		tableau[0] = 0;
    		tableau[1] = 0;
    		tableau[2] = 1;
     
    			while (Taxi3.positiony_Taxi3<533)
    			{	
    				SDL_BlitSurface(taxi3, NULL, ecran, &positionTaxi3);		
    				Taxi.positiony_Taxi=0;
    				Taxi2.positiony_Taxi2=0;
    				A = 0;
    			}
    	break;
    }
     
     
    		// if (A == 85)
    		// {
    		// 	p=0;
    		// }
     
    		// if (A == 190)
    		// {
    		// 	p=1;
    		// }
     
    		// if (A == 295)
    		// {
    		// 	p=2;
    		// }
     
    		// if (p == 0 )
    		// {
     
    		// 	tableau[0]=1;
    		// 	if (Taxi.positiony_Taxi>200)
    		// 	{
    		// 		tableau[0]=0;
    		// 	}
     
    		// }
     
    		// if (p == 1)
    		// {
    		// 	tableau[1]=1;
    		// 	if (Taxi2.positiony_Taxi2>200)
    		// 	{
    		// 		tableau[1]=0;
    		// 	}
    		// }
     
    		// if (p == 2)
    		// {
    		// 	tableau[2]=1;
    		// 	if (Taxi3.positiony_Taxi3>200)
    		// 	{
    		// 		tableau[2]=0;
    		// 	}
    		// }
     
     
    		// if (tableau[0] == 0 || tableau[1] == 0 || tableau[2] == 0)
    		// {
    		// 	SDL_BlitSurface(taxi, NULL, ecran, &positionTaxi);
    		// 	SDL_BlitSurface(taxi2, NULL, ecran, &positionTaxi2);
    		// 	SDL_BlitSurface(taxi3, NULL, ecran, &positionTaxi3);
    		// }
     
    		SDL_Flip(ecran);
    	}
     
    	// SDL_FreeSurface(texte);
    	SDL_FreeSurface(texte1);
    	// libération de la mémoire
    	SDL_FreeSurface(car);
    	SDL_FreeSurface(ecran);
    	SDL_FreeSurface(taxi);
    	SDL_FreeSurface(taxi2);
    	SDL_FreeSurface(taxi3);
    	TTF_CloseFont(police);
    	TTF_Quit();
    	affiche(tableau, 3);
    	// Fermeture de sdl et fin
    }
     
     
    /*
    int pos_aleatoire(retour1)
    {
    	srand(time(NULL));
    	const int MIN = 0, MAX = 2;
    	int nombre_aleatoire = 0;
     
    	// Nombre compris entre 0 à 3
    	nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
    	// Affiche la position du Taxi sur la route 
    	printf("La voiture est apparue à la position n°%d de la route\n\n", nombre_aleatoire); 
     
    	// Position d'apparition du Taxi
    	retour1=0;
    	retour1 = nombre_aleatoire*105 + 85;
     
    	// on renvoie le tout
     
    	return retour1;
     
    }
     
    */
     
     
    void affiche(int *tableau, int tailleTableau)
    {
    	int i;
     
    	for (i = 0 ; i < tailleTableau ; i++)
    	{
    		printf("%d\n", tableau[i]);
    	}
    }
     
     
    int valeur_random(int valeur){
     
    		srand(time(NULL));
    		const int MIN = 0, MAX = 2;
    		int nombre_aleatoire = 0;
     
    		// Nombre compris entre 0 à 3
    		nombre_aleatoire = (rand() % (MAX + 1 - MIN)) + MIN;
    			printf("La voiture est apparue à la position n°%d de la route\n\n", nombre_aleatoire); 
     
    		valeur = nombre_aleatoire*105 + 85;
    		// Position d'apparition du Taxi
    		return valeur;
    }

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Tableau de structure
    Salut,

    Si tu veux par exemple 10 voitures (indice de 0 à 9) tu peux faire un tableau de ta structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct
    {
        long positionx_Car;
        long positiony_Car;
        long taillex_Car;
        long tailley_Car;
        direction sens;
    }Car;
     
    Car Cars[10];
     
     
    // Utilisation par exemple pour le sens : Cars[indice].sens

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Ce qui me pose problème c'est affichage d'une nouvelle voiture et le stockage grâce à d'un tableau en boucle à chaque sortie de l'écran.
    C'est tout simple mais ... voilà.

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Dans ta structure : rajoute un paramètre ".actif"
    Pour une nouvelle voiture tu mets actif à 1 sur l'indice correspondant;
    et dans la fonction affichage tu fais une boucle qui balaie tous les indices, tu n'affiches que les actifs.
    Dans la fonction qui incrémente les positions pour le déplacement tu fais un test : si les positions sortent de l'écran tu remets "actif" à zéro.
    Quand tu veux créer une nouvelle voiture : tu prends un indice dont actif est à 0

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Vu que je n'ai pas beaucoup de temps pour finir ce projet, est ce que vous pouvez écrire le squelette de ce que vous venez de dire pour que j'ai un aperçu de ce que je dois faire.

    Merci bien

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut Fierté du travail accompli
    Citation Envoyé par vinoth Voir le message
    J'ai vraiment tout essayé, j'ai passé 15heures d'affilé (libre à vous de me croire). J'ai toujours pas résolue ce putain de problème.
    Aucun doute sur ton investissement et ton prof y sera certainement sensible. Finir un exercice parfaitement c'est pas le but. Apprendre de ses erreurs par un certain travail c'est bien plus enrichissant. En plus pour ton thème commencer à jurer ça met dans l'ambiance héhé !

    Ton utilisation de variables ne m'a pas surpris car ça prouve que tu ne comprends pas encore assez les tableaux. D'ailleurs si ça se trouve c'est un des buts de l'exercice. ll fallait un taxi par route ? 3 routes, 3 taxis, autant de variables. Pourquoi pas. Donc plutôt que d'essayer de l'impossible ou pire d'utiliser du code que tu ne comprendras pas je te conseille de rester là-dessus. Tu pourras expliquer à ton prof où tu as buté et à la limite laisser le code avec les tableaux en commentaires comme c'est déjà le cas. Tu feras mieux la prochaine fois !

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par vinoth Voir le message
    Ce qui me pose problème c'est affichage d'une nouvelle voiture et le stockage grâce à d'un tableau en boucle à chaque sortie de l'écran.
    Alors l'affichage des taxis semblent se faire autour de la ligne 322 avec un switch. Oula ! Tu as des boucles while bloquant la principale, ceux du jeu, et ça n'est pas là que tu dois tirer aléatoirement les taxis. Avant ta "boucle infinie" tu dois tout initialiser et quand un taxi sors de la limite fixée c'est là que tu interviens de même au début quand il n'y en a aucun. Après je n'ai pas tout compris concernant leur comportement donc c'est à toi de voir aussi ! Une autre erreur c'est "tableau" car en plus d'un nom ne voulant rien dire tu détruits les taxis quand un apparait sur une route. Il définit l'occupation des routes ? Je te conseille un nom comme "routes_occupées". Ensuite pour boucler sur un tableau faut faire comme ça (Désolé pseudo code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (n = 0; n < NOMBRE_ROUTES; n ++)
    {
    if (routes_occupées [n] == VRAI)
    {
    Déplacer ? Tester la limite de déplacement ?
    }
    }
    Une chose importante serait de parvenir à gérer au moins un taxi. À partir de là tu pourras en rajouter un deuxième voire même passer de taxi1, taxi2… à un tableau de taxis.

    Le plus important à ce stade pour ne pas devenir fou serait déjà de clarifier ton code. Quelques conseils :
    • Ligne 108 : Tu initialises les images des taxis comme si ils étaient tous différents alors qu'il n'y en a qu'une au final. Faut pas confondre les taxis et leur image ! Donc je te conseille de renommer "taxi" en quelque chose comme "image_taxi" et de supprimer les versions numérotées.
    • Fonctions : Dans ta boucle principale tu as plein de parties délimitées par des commentaires. Le mieux serait de les déplacer chacune dans une fonction. Par exemple au début tu gérer les évènements donc hop une fonction "gérer_évènement" avec les paramètres qui vont bien (event, Car…).
    • Nombres magiques : 5 ? 50 ? 85 ? Tu as étudié les constantes avec #define ? Sinon faut juste remplacer ces nombres par des variables. Par exemple si j'ai bien compris 533 c'est la limite de déplacement d'un taxi donc un nom comme "POS_Y_MAX_TAXI". À toi de choisir en fonction des autres.
    • Commentaires : Que fait la fonction valeur_random par exemple ? Son nom n'est pas aussi très explicite.
    • Ligne 229 : Elle est beaucoup trop longue. Comme le code pour les taxis est le même faut une fonction. En fait à chaque fois que tu copies-colles quelque chose il faut utiliser une fonction et passer les variables en paramètres. Quelque chose comme "tester_collision (Car, Taxi)". Comme ça ensuite ton if n'a que 3 appels à elle séparée par des ||. Faudrait aussi utiliser des () pour clarifier. Genre "(Car.positionx_Car <= (Taxi.positionx_Taxi + 50))".

    Désolé je peux pas mieux faire ! Le plus important c'est de comprendre où tu auras bloqué et les points à travailler pour faire mieux la prochaine fois.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Je vous remercie pour ces conseils très constructif, vous m'avez éclaircie sur pas mal de chose !

    Par contre je ne suis pas le genre de personne à baisser les bras à cause de mon piètre niveau de programmeur , je me battrais jusqu'à la dernière seconde du temps qu'il me reste pour comprendre mes erreurs et chercher les solutions.

    Donc priorité n°1 : Revoir mon code de A à Z, clarifier avec des fonctions pour simplifier l'architecture de mon programme. C'est noté !

    Je vais essayé de faire de mon max, et je vous renvoie les modif le plus vite que je pourrais (avec un peu de chance).

    Merci bien.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai réussi à faire l'apparition des taxis aléatoirement !!!

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Super ! N'hésite pas à partager ta solution ça pourra être utile à d'autres. Il reste des choses à faire par rapport à la problématique de départ ? Désolé c'est pas évidemment de suivre.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2015, 10h46
  2. [Débutant] faire une boucle pour lire plusieurs fichiers à la suite
    Par hittie dans le forum MATLAB
    Réponses: 6
    Dernier message: 30/12/2011, 13h39
  3. Faire apparaître un champ texte en cliquant sur un select
    Par yoyot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/03/2005, 16h16
  4. [nouveau] saisir plusieurs espace de suite ou tabuler
    Par siuol dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 28/02/2005, 12h32

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