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 Traction 2D


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut jeu Traction 2D
    Bonjour
    je suis en cours de réaliser un projet , qui se nomme "Traction" voici un lien pour comprendre le principe du jeu : http://www.jeux-gratuit.com/jeu-3149-traction-2.html
    j'ai mis dans mon projet 3 fichiers ".c" et 3 fichiers ".h"
    main.c -> fonction principale dans laquelle il y a une boucle qui gere si le joueur peut jouer ,quitter l'écran ,ou entrer un password .
    jeu.c -> la fonction globale de mon jeu dans laquelle il y a le corps de ma fonction
    fichiers.c -> qui a comme but charger ou sauvegarder un niveau
    jeu.h ->prototypes des différents fonction du fichiers ".c"
    constantes.h->les constantes global écrites en majuscules
    fichiers.h->prototypes des fonctions du fichier ".h"
    lors de l'exécution le stage s'affiche normalement, mais je n'arrive pas à deplacer le cube bleu : en vérité dés que j'appuie sur les touches haut bas gauche ou droite mon programme cesse de fonctionner . Après des heures de réflexion je n'arrive pas à comprendre ou est l'erreur ...

    voici le fichier "jeu.c" qui est le corps de mon projet d'ailleur c'est le seul fichier qui est mis pour manipuler le jeu est ce que vous pouvez m'aidez svp ça serai vraiment sympa
    ps: tout les mots en majuscules sont des constantes :



    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h>
    #include <SDL_image.h>

    #include "constantes.h"
    #include "jeu.h"

    void jouer(SDL_Surface *ecran)
    {

    SDL_Surface *CubeBleu = NULL, *CubeNoir = NULL, *CubeBlanc = NULL, *CubeRouge = NULL;
    SDL_Rect position, positionJoueur;
    SDL_Event event;

    int continuer = 1, objectifAtteint = 0, i = 0, j = 0;
    int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

    // Chargement des sprites (décors, personnage...)
    CubeBlanc = IMG_Load("CubeBlanc.bmp");
    CubeNoir = IMG_Load("CubeNoir.bmp");
    CubeBleu = IMG_Load("CubeBleu.bmp");
    CubeRouge = IMG_Load("CubeRouge.bmp");



    // Chargement du niveau
    if (!chargerNiveau(carte))
    exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau

    // Recherche de la position de Mario au départ
    for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
    for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
    {
    if (carte[i][j] == CubeBleu) // Si CubeBleu se trouve à cette position sur la carte
    {
    positionJoueur.x = i;
    positionJoueur.y = j;
    carte[i][j] = CubeBlanc;
    }
    }
    }

    // Activation de la répétition des touches
    SDL_EnableKeyRepeat(100, 100);

    while (continuer)
    {
    SDL_WaitEvent(&event);
    switch(event.type)
    {
    case SDL_QUIT:
    continuer = 0;
    break;
    case SDL_KEYDOWN:
    switch(event.key.keysym.sym)
    {
    case SDLK_ESCAPE:
    continuer = 0;
    break;
    case SDLK_UP:

    deplacerJoueur(carte, &positionJoueur, HAUT);

    break;
    case SDLK_DOWN:

    deplacerJoueur(carte, &positionJoueur, BAS);

    break;
    case SDLK_RIGHT:

    deplacerJoueur(carte, &positionJoueur, DROITE);
    break;
    case SDLK_LEFT:

    deplacerJoueur(carte, &positionJoueur, GAUCHE);
    break;
    }
    break;
    }

    // Effacement de l'écran
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

    // Placement des objets à l'écran
    objectifAtteint = 0;

    for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    {
    for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
    {
    position.x = i * TAILLE_BLOC;
    position.y = j * TAILLE_BLOC;

    switch(carte[i][j])
    {
    case CUBEBLANC:
    SDL_BlitSurface(CubeBlanc, NULL, ecran, &position);
    break;
    case CUBEBLEU:
    SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
    break;
    case CUBENOIR:
    SDL_BlitSurface(CubeNoir, NULL, ecran, &position);
    break;
    case CUBEROUGE:
    SDL_BlitSurface(CubeRouge, NULL, ecran, &position);
    objectifAtteint = 1;
    break;
    }
    }
    }

    // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
    if (!objectifAtteint)
    continuer = 0;

    // On place le joueur à la bonne position
    position.x = positionJoueur.x * TAILLE_BLOC;
    position.y = positionJoueur.y * TAILLE_BLOC;
    SDL_BlitSurface(CubeBleu, NULL, ecran, &position);



    SDL_Flip(ecran);
    }

    // Désactivation de la répétition des touches (remise à 0)
    SDL_EnableKeyRepeat(0, 0);

    // Libération des surfaces chargées
    SDL_FreeSurface(CubeBlanc);
    SDL_FreeSurface(CubeBleu);
    SDL_FreeSurface(CubeNoir);
    SDL_FreeSurface(CubeRouge);

    }

    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    {
    switch(direction)
    {
    case HAUT:
    while (!(carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 >= 0))
    {
    // Si on arrive là, c'est qu'on peut déplacer le joueur !

    deplacerCube(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);

    pos->y--;
    } // On peut enfin faire monter le joueur (oufff !)
    break;


    case BAS:
    while (!(carte[pos->x][pos->y+1]== CUBENOIR) || (pos->y + 1 < NB_BLOCS_HAUTEUR))
    {

    deplacerCube(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);

    pos->y++;
    }
    break;


    case GAUCHE:
    while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
    {

    deplacerCube(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);

    pos->x--;
    }
    break;


    case DROITE:
    while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))


    deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);

    pos->x++;


    break;
    }
    }

    void deplacerCube(int *premiereCase, int *secondeCase)
    {
    if (*premiereCase == CUBEBLEU )
    {
    if (*secondeCase == CUBEROUGE)
    ;
    else
    *secondeCase = CUBEBLEU;

    if (*premiereCase == CUBEBLEU)
    *premiereCase = CUBEBLANC;

    }
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Pouvez vous reposter le code dans des balises [ code ] et [ /code ] (sans espaces (ou le bouton '#' )) car sans l'indentation du code ... je ne vais pas pouvoir le relire.
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    oui bien sur
    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
     
     
     
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h>
    #include <SDL_image.h>
     
    #include "constantes.h"
    #include "jeu.h"
     
    void jouer(SDL_Surface *ecran)
    {
     
        SDL_Surface *CubeBleu = NULL, *CubeNoir = NULL, *CubeBlanc = NULL, *CubeRouge = NULL;
        SDL_Rect position, positionJoueur;
        SDL_Event event;
     
        int continuer = 1, objectifAtteint = 0, i = 0, j = 0;
        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
     
        // Chargement des sprites (décors, personnage...)
        CubeBlanc = IMG_Load("CubeBlanc.bmp");
        CubeNoir = IMG_Load("CubeNoir.bmp");
        CubeBleu = IMG_Load("CubeBleu.bmp");
        CubeRouge = IMG_Load("CubeRouge.bmp");
     
     
     
        // Chargement du niveau
        if (!chargerNiveau(carte))
            exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
     
        // Recherche de la position de Mario au départ
        for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
            {
                if (carte[i][j] == CubeBleu) // Si CubeBleu se trouve à cette position sur la carte
                {
                    positionJoueur.x = i;
                    positionJoueur.y = j;
                    carte[i][j] = CubeBlanc;
                }
            }
        }
     
        // Activation de la répétition des touches
        SDL_EnableKeyRepeat(100, 100);
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
    switch(event.type)
    {
        case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
                case SDLK_ESCAPE:
                    continuer = 0;
                    break;
                case SDLK_UP:
     
                    deplacerJoueur(carte, &positionJoueur, HAUT);
     
                    break;
                case SDLK_DOWN:
     
                    deplacerJoueur(carte, &positionJoueur, BAS);
     
                    break;
                case SDLK_RIGHT:
     
                    deplacerJoueur(carte, &positionJoueur, DROITE);
                    break;
                case SDLK_LEFT:
     
                    deplacerJoueur(carte, &positionJoueur, GAUCHE);
                    break;
            }
            break;
    }
     
            // Effacement de l'écran
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            // Placement des objets à l'écran
            objectifAtteint = 0;
     
            for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
            {
                for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                {
                    position.x = i * TAILLE_BLOC;
                    position.y = j * TAILLE_BLOC;
     
                    switch(carte[i][j])
                    {
                        case CUBEBLANC:
                            SDL_BlitSurface(CubeBlanc, NULL, ecran, &position);
                            break;
                        case CUBEBLEU:
                            SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
                            break;
                        case CUBENOIR:
                            SDL_BlitSurface(CubeNoir, NULL, ecran, &position);
                            break;
                        case CUBEROUGE:
                            SDL_BlitSurface(CubeRouge, NULL, ecran, &position);
                            objectifAtteint = 1;
                            break;
                    }
                }
            }
     
            // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
            if (!objectifAtteint)
                continuer = 0;
     
            // On place le joueur à la bonne position
            position.x = positionJoueur.x * TAILLE_BLOC;
            position.y = positionJoueur.y * TAILLE_BLOC;
            SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
     
     
     
            SDL_Flip(ecran);
        }
     
        // Désactivation de la répétition des touches (remise à 0)
        SDL_EnableKeyRepeat(0, 0);
     
        // Libération des surfaces chargées
        SDL_FreeSurface(CubeBlanc);
        SDL_FreeSurface(CubeBleu);
        SDL_FreeSurface(CubeNoir);
        SDL_FreeSurface(CubeRouge);
     
    }
     
    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    {
        switch(direction)
        {
            case HAUT:
               while (!(carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 >= 0))
                {
                // Si on arrive là, c'est qu'on peut déplacer le joueur !
     
                deplacerCube(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
     
                pos->y--;
                } // On peut enfin faire monter le joueur (oufff !)
                break;
     
     
            case BAS:
            while (!(carte[pos->x][pos->y+1]== CUBENOIR) || (pos->y + 1 < NB_BLOCS_HAUTEUR))
                {
     
               deplacerCube(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
     
                pos->y++;
                }
                break;
     
     
            case GAUCHE:
                   while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
                {
     
                deplacerCube(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
     
                pos->x--;
                }
                break;
     
     
            case DROITE:
                   while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
     
     
                deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
     
                pos->x++;
     
     
                break;
        }
    }
     
    void deplacerCube(int *premiereCase, int *secondeCase)
    {
        if (*premiereCase == CUBEBLEU )
        {
            if (*secondeCase == CUBEROUGE)
           ;
            else
                *secondeCase = CUBEBLEU;
     
            if (*premiereCase == CUBEBLEU)
                *premiereCase = CUBEBLANC;
     
        }
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Note historique:

    Ce jeu, je le trouve trop simple à vrai dire. De plus il me rappelle un jeu des années 90 qui était sorti sur Amiga / Atari ST -> Atomix. Atomix était plus dur, car sur le même principe, il fallait rassembler, plusieurs carré pour reconstituer tout une pièce. Sachant que le fait de déplacer plusieurs carrés veut aussi dire qu'il faut allait dans le bon ordre et qu'il faut aussi savoir s'aider des autres carrés de nous avions

    Bref, j'attends de voir votre réalisation avec impatiente

    Merci d'avoir reposté le code.
    J'ai jeté un premier coup d'oeil rapide et déjà j'ai vu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    case DROITE:
                   while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
     
     
                deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
     
                pos->x++;
     
     
                break;
    Il manque les accolade du while.

    Autre point ... dans un cas ou vous avez que des cubes noir sur les bordures,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
                {
     
                deplacerCube(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
    pos-> -1 == 0 par exemple ... et après vous demandez de mettre le cube à pos->x -2 ( -1 O_o ) ... donc bug.

    Si les indications que je vous ai donné ne fonctionnent pas, je vous conseille d'utiliser un débuggueur (Inclut dans Visual Studio / Code::Blocks ou gdb) afin d'exécuter le programme pas à pas et de vérifié ce qui se passe.
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Bonjour
    tout d'abord je vous remercie de m'avoir répondu c'est vraiment sympa de votre part
    j'ai pris compte de la faille que vous m'avez signaler concernant la fonction deplacerCube
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    case GAUCHE:
                   while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
                {
     
                deplacerCube(&carte[pos->x ][pos->y], &carte[pos->x -1][pos->y]);
     
                pos->x--;
                }
    // ici je crois que j'ai jouer avec les indices . je teste si la case d'après est différente du cube noir mais aussi si elle n'est pas en dehors de la carte . le cube ne doit pas s'arrêter avant qu'il soit devant un cube noir .
    mais ceci dit , je crois que le probleme n'est pas encore résolu car aprés l'execution je retombe sur le meme probleme . j'ai activé le debugger l'erreure est dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     *secondeCase = CUBEBLEU;
    je voulais dans cette instruction changer le cube de départ par le cube blanc et le cube d'arrivé par le cube bleu et vice versa lors du déplacement mais apparemment il y a une erreur logique .
    j'ai remplacer par ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void deplacerCube(int *premiereCase, int *secondeCase)
    {
        if (*premiereCase == CUBEBLEU )
        {
            if (*secondeCase == CUBEBLANC)
          *secondeCase == CUBEBLEU;
          *premiereCase == CUBEBLANC;
    pas de plantage mais mon cube ne bouge point quand j'appuie sur les fléches
    Dans l'attente d'une réponse favorable
    Amicalement

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Je pensais que l'histoire d'indice que je vous ai indiqué etait celui qui posait vraiment probleme.
    Car vous testez une case pour savoir si elle est valide ou pas, mais vous essayez de vous placer sur la suivante (qui du coup, peut etre invalide)

    De plus ... cela ne plante plus car vous ne faites meme plus d'affectation.

    [code]*secondeCase == CUBEBLEU;
    *premiereCase == CUBEBLANC;p/code]
    Cela ne fait pas d'affectation, mais juste des tests (donc cela ne change rien).
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    vous pouvez m'aidez stp
    j'arrive pas à resoudre ce probléme

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Je pensais avoir donner la solution et encore plus important, la methode pour resoudre le probleme si je ne la donnait pas.

    Ma question,maintenant, est ou en etes vous ?

    Prenons le code de la derniere fois:

    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
     
    case HAUT:
               while (!(carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 >= 0))
                {
                // Si on arrive là, c'est qu'on peut déplacer le joueur !
                deplacerCube(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
                pos->y--;
                } // On peut enfin faire monter le joueur (oufff !)
                break;
     
            case BAS:
            while (!(carte[pos->x][pos->y+1]== CUBENOIR) || (pos->y + 1 < NB_BLOCS_HAUTEUR))
                {
               deplacerCube(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
                pos->y++;
                }
                break;
     
            case GAUCHE:
                   while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
                {
                deplacerCube(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
                pos->x--;
                }
                break;
     
     
            case DROITE:
    {
                   while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
                deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
                pos->x++;
                break;
    }
    Nous savons que le probleme vient de la, car le jeu crash des que l'on essaie de bouger.

    Ok, regardons le code, dans chaque cas. nous regardons si la case dans la direction correpondante est un Cube noir, ou si la case est en dehors du tableau. Certes le test est juste
    Par contre, si je lis le code, il semblerai que nous deplacons le cube de la case suivante, a la case d'apres (et non de la case actuelle a la case suivante) (cela est en lisant le code ... naivement disons ... vous devez avoir vos raisons)

    La cause du crash:

    Prenons un cas unique (sachant que l'erreur est presente dans les 4 cas):
    [case]
    case DROITE:
    {
    while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
    deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
    pos->x++;
    break;
    }[/case]
    Separons en partie logique. Le test:
    - On regarde la case a posX + 1 ; posY n'est pas noire.
    - On regarde si posX + 1 est plus petit que la taille de notre tableau.

    Comme je l'ai dit ... tout cela est tres juste. Ligne suivante:
    Nous deplacons notre cube de posX + 1 ; posY a posX + 2 ; posY
    Certes ... mais je ne me rappelle pas avoir tester posX + 2 ... cela voudrait donc dire, que theoriquement, le cube est possiblement noir, et que nous ne le sachions pas ... et que la case ou je suis ... ne sera pas changer.

    Donc ... et la ... si vous ne voyez pas l'erreur, vous allez etre plus qu'obliger d'utiliser un debugguer:
    Pourquoi ne deplacons nous pas le cube de la case actuelle a la case suivante, au lieu de deplacer le cube de la case suivante a la prochaine case (+2) ?
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    je suis tout a fait d'accord avec vous
    j'ai changé le code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     case DROITE:
                   while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
     
     
               { deplacerCube(&carte[pos->x ][pos->y], &carte[pos->x + 1][pos->y]);
     
                pos->x++;
               }
     
                break;
    j'ai mis lors de cette instruction le déplacement du cube qu'on teste vers la case suivante . mais malgré cela l'image reste fixe je ne vois pas le cube se déplacer lors de l'appuie d'une touche est ce que c'est dû au non mise à jour de l'écran ? car si le cube se déplace je crois que le problème est résolu

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    C'est possible que ce soit du à la non mise à jour de l'écran (SDL_Flip()).
    Sinon on peut vérifier au debuggueur si le cube se déplace.
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Bonjour à tous voila j'ai enfin réussi la partie " jeu "
    prochaine étapes : afficher les noms des joueurs associés aux meilleurs scores!
    mais je trouve bizarre que "printf" et "scanf" ne fonctionnent pas sur la fenêtre sdl.
    des ideés concernant l'ideé des meilleurs scores associés aux joueurs?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Des idées:

    - Utiliser un sélecteur (un truc qui affiche toute les lettres et demande au joueur d'insérer son nom en utilisant le curseur)
    - Surcharger (ou refaire) une boucle d'évènement permettant de capturer les touches insérées afin de prendre le nom du joueur.
    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.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    merci LittleWhite ça me semble une tres bonne idée .
    mais avant pour me familiariser avec la "SDL_ttf" qui permet d'écrire je voulais juste afficher des petits messages en fin et au début de chaque stage .
    qu esque vous en pensez est ce que je doit écrire une fonction qui permet d'écrire et l'appeler dans le main??? je te rappelle la boucle du fichier 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
     
     while (continuer)
        {
     
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_KP1: // Veut arrêter le jeu
                            continuer = 0;
                            break;
                        case SDLK_ESCAPE: // Demande à jouer
                            jouer(ecran);
     
                            //SDL_Flip(ecran);
                            break;
    //
                    }
                    break;
            }
    ou l'inclure directement dans le fichier jeu ?
    merci d'avance

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Je pense qu'une fonction du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char writeText(SDL_Surface* pWindow, SDL_Font* pFont, int posX, int posY, SDL_Color colour, char* pText);
    Est une bonne idée. La fonction vous pouvez l'appeler de partout ou vous voulez.
    Bien sur, l'exemple que j'ai donné, n'est qu'un exemple
    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.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     char writeText(SDL_Surface* ecran,SDL_Surface *texte, TTF_Font* police, SDL_Rect position, SDL_Color couleur,char *ptexte)
     {
     
        couleur= {0, 0, 0};
        TTF_Init();
    *ptexte = "Stage1";
     
        /* Chargement de la police */
        police = TTF_OpenFont("angelina.ttf", 65);
        /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
        texte = TTF_RenderText_Blended(police, *ptexte, couleur)
     
            position.x = 0;
            position.y = 0;
            SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
            SDL_Flip(ecran);
     
     
        TTF_CloseFont(police);
        TTF_Quit();
     
        SDL_FreeSurface(texte);
        SDL_Quit();
     
     
        return EXIT_SUCCESS;
    }
    vous en pensez quoi comme fonction .
    ps : j'aurai bien aimé que à chaque appelle à la fonction le "Stage i" s'incrémente mais comment procéder ?
    merci d'avance

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    Je pense que c'est un début, sauf que le code est horriblement problématique.

    - Vous n'allez tout de même pas charger la police / la décharger à chaque fois que vous utilisez une fonction pour afficher du texte
    - Vous quittez SDL une fois que vous avez afficher du texte ?
    - Vous devriez utiliser mes arguments au lieu de tout refaire sur place. Les arguments permettent de rendre la fonction très flexible, et donc de répondre à votre question en passant. Sinon en deuxième aide par rapport à votre question veuillez lire la FAQ C. Merci.
    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.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    je vais essayé de prendre en compte les remarques que tu ma dit
    merci

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Mes Salutations les plus sincères monsieur LittleWhite
    J'ai réussi à creér une fonction dynamique qui permet d'écrire du text voici la fonction:
    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
     void writeText(SDL_Surface* ecran,SDL_Surface *texte, TTF_Font *police, SDL_Rect position, SDL_Color couleur,const char* ptext )
     {
     
        /* Chargement de la police */
     police = TTF_OpenFont("ROCK.ttf", 65);
     TTF_SetFontStyle(police, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);
     
        /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
        texte = TTF_RenderText_Blended(police, ptext, couleur);
            SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
     
            SDL_Flip(ecran);
     
     TTF_CloseFont(police);
     
    SDL_FreeSurface(texte);
     
     
     
     
    }
    mais le plus dur reste à faire, sachant bien entendu que je veux exploiter cette fonction pour afficher des messages dans mon text :

    afficher "Stage i" (avant chaque i eme stage)
    afficher "mission completed" à la fin de chaque stage

    ça parait simple mais je ne sait pas ou inclure cette fonction dans mon code pouvez vous m'aidez voici la fonction jeu.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
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h>
    #include <SDL_image.h>
    #include <SDL/SDL_ttf.h>
     
    #include "constantes.h"
    #include "jeu.h"
     
    void jouer(SDL_Surface *ecran)
    {
    const char* ptext ="hello";
    SDL_Rect positionTexte;
    positionTexte.x = 0;
    positionTexte.y = 0;
    SDL_Color couleur={255,255,255};
    SDL_Surface *texte = NULL;
    TTF_Font *police = NULL;
        TTF_Init();
     
        SDL_Surface *CubeBleu = NULL, *CubeNoir = NULL, *CubeBlanc = NULL, *CubeRouge = NULL;
        SDL_Rect position, positionJoueur;
        SDL_Event event;
     
        int continuer= 1, objectifAtteint = 0, i = 0, j = 0;
        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
     
        // Chargement des sprites (décors, personnage...)
        CubeBlanc = IMG_Load("floor.png");
        CubeNoir = IMG_Load("wall-2.png");
        CubeBleu = IMG_Load("wall3.png");
        CubeRouge = IMG_Load("bonus5.png");
     
        FILE* fichier = NULL;
        fichier = fopen("1.txt", "r");
     
        if (fichier == NULL)
            return;
     
    debut:
    while(continuer)
     {writeText( ecran,texte, police,  position,  couleur,ptext);
     SDL_WaitEvent(&event);
    //writeText( ecran,texte, police,  position,  couleur);
     switch(event.type)
     case SDL_KEYDOWN:
     switch(event.key.keysym.sym)
            {
                case SDLK_ESCAPE:
                    //continuer = 0;
                    break;
     
     }break;
     }
            // Effacement de l'écran
            //SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_Flip(ecran);
     
     
    //     Chargement du niveau
     
        if (!chargerNiveau(carte, fichier))
            exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
     
     
        // Recherche de la position de Mario au départ
        for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
            {
     
                if (carte[i][j] ==CUBEBLEU) // Si CubeBleu se trouve à cette position sur la carte
                {
                    positionJoueur.x = i ;
                    positionJoueur.y = j;
                   carte[i][j] = CUBEBLANC;
                }
            }
        }
     
        // Activation de la répétition des touches
        SDL_EnableKeyRepeat(100, 100);
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
    switch(event.type)
    {
        case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
                case 1:
                    continuer = 0;
                    break;
                case SDLK_F3://nouveau stage qui commence
     
                   goto debut;
                   break;
                case SDLK_UP:
     
                    deplacerJoueur(carte, &positionJoueur, HAUT);
     
     
                    break;
                case SDLK_DOWN:
     
                    deplacerJoueur(carte, &positionJoueur, BAS);
     
     
                    break;
                case SDLK_RIGHT:
     
                    deplacerJoueur(carte, &positionJoueur, DROITE);
     
                    break;
                case SDLK_LEFT:
     
                    deplacerJoueur(carte, &positionJoueur, GAUCHE);
                    break;
            }
            break;
    }
     
            SDL_Flip(ecran);
     
            // Effacement de l'écran
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
            // Placement des objets à l'écran
            objectifAtteint = 0;
     
            for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
            {
                for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                {
                    position.x = i * TAILLE_BLOC;
                    position.y = j * TAILLE_BLOC;
     
                    switch(carte[i][j])
                    {
                        case CUBEBLANC:
                            SDL_BlitSurface(CubeBlanc, NULL, ecran, &position);
                            break;
                        case CUBEBLEU:
                            SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
                            break;
                        case CUBENOIR:
                            SDL_BlitSurface(CubeNoir, NULL, ecran, &position);
                            break;
                        case CUBEROUGE:
                            SDL_BlitSurface(CubeRouge, NULL, ecran, &position);
                            objectifAtteint = 1;
                            break;
                    }
                }
            }
     
            // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
           if (!objectifAtteint)
                continuer = 0;
     
            // On place le joueur à la bonne position
            position.x = positionJoueur.x * TAILLE_BLOC;
            position.y = positionJoueur.y * TAILLE_BLOC;
            SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
     
    }
     
            //SDL_Flip(ecran);
     
     
        // Désactivation de la répétition des touches (remise à 0)
        SDL_EnableKeyRepeat(0, 0);
     
        // Libération des surfaces chargées
        SDL_FreeSurface(CubeBlanc);
        SDL_FreeSurface(CubeBleu);
        SDL_FreeSurface(CubeNoir);
        SDL_FreeSurface(CubeRouge);}
     
     
     
     
    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    {
        switch(direction)
        {
            case HAUT:
              do{ if ((carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 < 0))
                {break;}
                if (carte[pos->x][pos->y]==CUBEROUGE)
                {
                deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x][pos->y -1]);
                carte[pos->x][pos ->y]==CUBEBLEU;
     
                break;}
                // Si on arrive là, c'est qu'on peut déplacer le joueur !
     
                else {deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x][pos->y -1] );
     
                pos->y--;}}
                while(!((carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 < 0)));
                 // On peut enfin faire monter le joueur (oufff !)
                break;
     
     
            case BAS:
           do{ if ((carte[pos->x][pos->y+1] == CUBENOIR) || (pos->y + 1 >= NB_BLOCS_HAUTEUR))
                {break;}
                if (carte[pos->x][pos->y]==CUBEROUGE)
                {
                deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x][pos->y +1]);
                carte[pos->x][pos ->y]==CUBEBLEU;
     
                break;}
     
              else{ deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x][pos->y + 1]);
     
                pos->y++;
                }}
                while(!((carte[pos->x][pos->y+1] == CUBENOIR) || (pos->y + 1 >= NB_BLOCS_HAUTEUR)));
                break;
     
     
            case GAUCHE:
              do{     if ((carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 < 0))
                {break;}
                if (carte[pos->x][pos->y]==CUBEROUGE)
                {
                deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x-1][pos->y ]);
                carte[pos->x][pos ->y]==CUBEBLEU;
     
                break;}
     
               else{ deplacerCube(&carte[pos->x][pos->y], &carte[pos->x - 1][pos->y]);
     
                pos->x--;}
                }
                while(!((carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 < 0)));
                break;
     
     
            case DROITE:
               do{    if ((carte[pos->x +1][pos->y] == CUBENOIR) || (pos->x + 1 >= NB_BLOCS_LARGEUR ))
                   {break;}
                   if (carte[pos->x][pos->y]==CUBEROUGE)
                {
                deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x+1][pos->y ]);
                carte[pos->x][pos ->y]==CUBEBLEU;
     
                break;}
     
     
               else{ deplacerCube(&carte[pos->x ][pos->y], &carte[pos->x + 1][pos->y]);
     
                pos->x++;}
               }
               while(!((carte[pos->x +1][pos->y] == CUBENOIR) || (pos->x + 1 >= NB_BLOCS_LARGEUR )));
     
                break;
     
     
    }}
     
    void deplacerCube(int *premiereCase, int *secondeCase)
    {
        if(premiereCase == CUBEBLEU   )
        {
       *premiereCase = CUBEBLANC;
    if(secondeCase==CUBEROUGE)
         { *secondeCase==CUBEROUGE;
          *premiereCase==CUBEBLANC;
          }
     
     
         else
          *secondeCase==CUBEBLEU;
     
     
     
     
     
     
        }
    à noter que j'ai initialiser au début mes variables pour pouvoir inclure directement ma fonction à n'importe quel moment.
    merci d'avance

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 827
    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 827
    Points : 218 289
    Points
    218 289
    Billets dans le blog
    117
    Par défaut
    La fonction à toujours un problème, vous fermez la police (SDL_CloseFont) alors que vous pouvez la réutiliser par la suite.

    Et supprimez moi le chargement de la police de la fonction. Ce n'est pas pour rien que je vous passe un pointeur sur une Font.

    Pour afficher du texte, il faut juste appeler la fonction en lui passant les bons arguments. Après les appels de la fonction dépendent de ce que vous voulez faire.
    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.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    vous avez raison le chargement de la police est inutile
    tient regardez ce que j'ai essayer de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    case GAUCHE:
              do{     if ((carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 < 0))
                {break;}
                if (carte[pos->x][pos->y]==CUBEROUGE)
                {
                deplacerCube(&carte[pos->x][pos->y ], &carte[pos->x-1][pos->y ]);
                carte[pos->x][pos ->y]==CUBEBLEU;
                goto debut;
     
                break;
                }
    ici je veux dés que le cube coincide avec la destination je le renvoie vers le debut :
    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
    debut:
    while(continuer)
     {writeText( ecran,texte, police,  positionTexte,  couleur,ptext[k]);k++;
     SDL_WaitEvent(&event);
    //writeText( ecran,texte, police,  position,  couleur);
     switch(event.type)
     case SDL_KEYDOWN:
     switch(event.key.keysym.sym)
            {
                case SDLK_ESCAPE:
                    //continuer = 0;
                    break;
     
     }break;
     
     }
            // Effacement de l'écran
            //SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_Flip(ecran);
     
     
    //     Chargement du niveau
     
        if (!chargerNiveau(carte, fichier))
            exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
     
     
        // Recherche de la position de Mario au départ
        for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
            {
     
                if (carte[i][j] ==CUBEBLEU) // Si CubeBleu se trouve à cette position sur la carte
                {
                    positionJoueur.x = i ;
                    positionJoueur.y = j;
                   carte[i][j] = CUBEBLANC;
                }
            }
        }
     
        // Activation de la répétition des touches
        SDL_EnableKeyRepeat(100, 100);
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
    switch(event.type)
    {
        case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
                case 1:
                    continuer = 0;
    je veux que les stages se declenches de maniere automatiques mais il me donne une erreure : "label 'debut' used but not defined" c'est quoi

Discussions similaires

  1. Quel style de DirectX pour un jeu 2D ?
    Par delire8 dans le forum DirectX
    Réponses: 34
    Dernier message: 31/07/2003, 01h47
  2. Réponses: 7
    Dernier message: 18/06/2003, 16h20
  3. [socket][tcp] jeu en reseau
    Par souris_sonic dans le forum Développement
    Réponses: 2
    Dernier message: 30/05/2003, 08h31
  4. [C réseau débutant] jeu
    Par Heimdall dans le forum Développement
    Réponses: 6
    Dernier message: 22/05/2003, 14h58
  5. Une déclaration pour la survie du jeu vidéo en France
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 30/10/2002, 15h31

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