Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec la SDL

Sujet résolu
    19 septembre 2007 à 17:21:22

    Bonjour a tous,
    Ayant lu le cours de C++ j'ai décidé de revenir faire le TP de mario sokoban avec le C++ . Donc j'écris mes codes et quand j'essaie de compiler ca me renvoie l'erreur :

    Citation : erreur

    error : exepted constructor, destructor or type conversion before '=' token


    la ligne de l'erreur est celle la :
    1. mur = IMG_Load("mur.jpg");

    Voici le code entier au cas où :
    1. #include <iostream>
    2. #include <SDL/SDL.h>
    3. #include <SDL/SDL_image.h>
    4. #include "constantes.h"
    5. #include "jeu.h"
    6. using namespace std;
    7. SDL_Surface *mario[4] = {NULL};
    8. SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
    9. SDL_Event event;
    10. SDL_Rect position, positionJoueur;
    11. bool continuer = true, objectifsRestants = false;
    12. int i = 0, j = 0;
    13. int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
    14. /* Chargement des sprites (décors, personnage...)*/
    15. mur = IMG_Load("mur.jpg");
    16. caisse = IMG_Load("caisse.jpg");
    17. caisseOK = IMG_Load("caisse_ok.jpg");
    18. objectif = IMG_Load("objectif.png");
    19. mario[BAS] = IMG_Load("mario_bas.gif");
    20. mario[GAUCHE] = IMG_Load("mario_gauche.gif");
    21. mario[HAUT] = IMG_Load("mario_haut.gif");
    22. mario[DROITE] = IMG_Load("mario_droite.gif");
    23. marioActuel = mario[BAS]; // Mario sera dirigé vers le bas au départ
    24. // Recherche de la position de Mario au départ
    25. for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
    26. {
    27.     for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
    28.     {
    29.         if (carte[i][j] == MARIO) // Si Mario se trouve à cette position sur la carte
    30.         {
    31.             positionJoueur.x = i;
    32.             positionJoueur.y = j;
    33.             carte[i][j] = VIDE;
    34.         }
    35.     }
    36. }
    37. SDL_EnableKeyRepeat(100, 100);  // Activation de la répétition des touches
    38. switch(event.type)
    39. {
    40.     case SDL_QUIT:
    41.         continuer = false;
    42.         break;
    43.     case SDL_KEYDOWN:
    44.         switch(event.key.keysym.sym)
    45.         {
    46.             case SDLK_ESCAPE:
    47.                 continuer = false;
    48.                 break;
    49.             case SDLK_UP:
    50.                 marioActuel = mario[HAUT];
    51.                 deplacerJoueur(carte, &positionJoueur, HAUT);
    52.                 break;
    53.             case SDLK_DOWN:
    54.                 marioActuel = mario[BAS];
    55.                 deplacerJoueur(carte, &positionJoueur, BAS);
    56.                 break;
    57.             case SDLK_RIGHT:
    58.                 marioActuel = mario[DROITE];
    59.                 deplacerJoueur(carte, &positionJoueur, DROITE);
    60.                 break;
    61.             case SDLK_LEFT:
    62.                 marioActuel = mario[GAUCHE];
    63.                 deplacerJoueur(carte, &positionJoueur, GAUCHE);
    64.                 break;
    65.         }
    66.         break;
    67. }
    68. SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));    // Effacement de l'écran
    69. // Placement des objets à l'écran
    70. objectifsRestants = false;
    71. for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
    72. {
    73.     for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
    74.     {
    75.         position.x = i * TAILLE_BLOC;
    76.         position.y = j * TAILLE_BLOC;
    77.         switch(carte[i][j])
    78.         {
    79.             case MUR:
    80.                 SDL_BlitSurface(mur, NULL, ecran, &position);
    81.                 break;
    82.             case CAISSE:
    83.                 SDL_BlitSurface(caisse, NULL, ecran, &position);
    84.                 break;
    85.             case CAISSE_OK:
    86.                 SDL_BlitSurface(caisseOK, NULL, ecran, &position);
    87.                 break;
    88.             case OBJECTIF:
    89.                 SDL_BlitSurface(objectif, NULL, ecran, &position);
    90.                 objectifsRestants = true;
    91.                 break;
    92.         }
    93.     }
    94. }
    95. if (!objectifsRestants)
    96.     continuer = false;
    97. // On place le joueur à la bonne position
    98. position.x = positionJoueur.x * TAILLE_BLOC;
    99. position.y = positionJoueur.y * TAILLE_BLOC;
    100. SDL_BlitSurface(marioActuel, NULL, ecran, &position);
    101. SDL_Flip(ecran);
    102. // Désactivation de la répétition des touches (remise à 0)
    103. SDL_EnableKeyRepeat(0, 0);
    104. // Libération des surfaces chargées
    105. SDL_FreeSurface(mur);
    106. SDL_FreeSurface(caisse);
    107. SDL_FreeSurface(caisseOK);
    108. SDL_FreeSurface(objectif);
    109. for (i = 0 ; i < 4 ; i++)
    110.     SDL_FreeSurface(mario[i]);
    111. void deplacerCaisse(int *premiereCase, int *secondeCase)
    112. {
    113.     if (*premiereCase == CAISSE || *premiereCase == CAISSE_OK)
    114.     {
    115.         if (*secondeCase == OBJECTIF)
    116.             *secondeCase = CAISSE_OK;
    117.         else
    118.             *secondeCase = CAISSE;
    119.         if (*premiereCase == CAISSE_OK)
    120.             *premiereCase = OBJECTIF;
    121.         else
    122.             *premiereCase = VIDE;
    123.     }
    124. }
    125. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    126. {
    127.     switch(direction)
    128.     {
    129.         case HAUT :
    130.             if (pos->y - 1 < 0) // Si le joueur dépasse l'écran, on arrête
    131.                 break;
    132.             if (carte[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
    133.                 break;
    134.             // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
    135.             if ((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) &&
    136.                 (pos->y - 2 < 0 || carte[pos->x][pos->y - 2] == MUR ||
    137.                 carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
    138.                 break;
    139.             // Si on arrive là, c'est qu'on peut déplacer le joueur !
    140.             // On vérifie d'abord s'il y a une caisse à déplacer
    141.             deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
    142.             pos->y--; // On peut enfin faire monter le joueur (oufff !)
    143.         break;
    144.         case BAS :
    145.             if (pos->y + 1 > HAUTEUR_FENETRE) // Si le joueur dépasse l'écran, on arrête
    146.                 break;
    147.             if (carte[pos->x][pos->y + 1] == MUR) // S'il y a un mur, on arrête
    148.                 break;
    149.             // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
    150.             if ((carte[pos->x][pos->y + 1] == CAISSE || carte[pos->x][pos->y + 1] == CAISSE_OK) &&
    151.                 (pos->y + 2 < HAUTEUR_FENETRE || carte[pos->x][pos->y + 2] == MUR ||
    152.                 carte[pos->x][pos->y + 2] == CAISSE || carte[pos->x][pos->y + 2] == CAISSE_OK))
    153.                 break;
    154.             // Si on arrive là, c'est qu'on peut déplacer le joueur !
    155.             // On vérifie d'abord s'il y a une caisse à déplacer
    156.             deplacerCaisse(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
    157.             pos->y++; // On peut enfin faire monter le joueur (oufff !)
    158.         break;
    159.         case DROITE :
    160.             if (pos->x + 1 > LARGEUR_FENETRE) // Si le joueur dépasse l'écran, on arrête
    161.                 break;
    162.             if (carte[pos->x + 1][pos->y] == MUR) // S'il y a un mur, on arrête
    163.                 break;
    164.             // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
    165.             if ((carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK) &&
    166.                 (pos->x + 2 < LARGEUR_FENETRE || carte[pos->x + 1][pos->y] == MUR ||
    167.                 carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK))
    168.                 break;
    169.             // Si on arrive là, c'est qu'on peut déplacer le joueur !
    170.             // On vérifie d'abord s'il y a une caisse à déplacer
    171.             deplacerCaisse(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
    172.             pos->x++; // On peut enfin faire monter le joueur (oufff !)
    173.         break;
    174.         case GAUCHE :
    175.             if (pos->x + 1 > 0) // Si le joueur dépasse l'écran, on arrête
    176.                 break;
    177.             if (carte[pos->x - 1][pos->y] == MUR) // S'il y a un mur, on arrête
    178.                 break;
    179.             // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
    180.             if ((carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK) &&
    181.                 (pos->x + 2 < 0 || carte[pos->x - 1][pos->y] == MUR ||
    182.                 carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK))
    183.                 break;
    184.             // Si on arrive là, c'est qu'on peut déplacer le joueur !
    185.             // On vérifie d'abord s'il y a une caisse à déplacer
    186.             deplacerCaisse(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
    187.             pos->x--; // On peut enfin faire monter le joueur (oufff !)
    188.         break;
    189.     }

    Merci a vous ...
    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2007 à 17:31:02

      Il manquerais pas... un main()?
      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2007 à 18:18:58

        C'est normal tu ne peux appeler de fonction dans l'espace global (en dehors d'une fonction).

        Tu ne peux donc pas faire des IMG_Load ou tu le fais.

        Sinon, les variables globales c'est mal surtout quand on fait une classe qui est sensé les contenir.
        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          19 septembre 2007 à 19:18:49

          Citation : Nanoc

          Sinon, les variables globales c'est mal surtout quand on fait une classe qui est sensé les contenir.


          A mon avis il a oublié de mettre tout ça dans un main() :p

          Erreur d'inatention, bien qu'un peu grosse :D
          • Partager sur Facebook
          • Partager sur Twitter
            22 septembre 2007 à 22:44:45

            En fait j'ai séparé le main de la fonction qui permet de jouer :) sinon je vais essayer les conseils de Nanoc ...
            • Partager sur Facebook
            • Partager sur Twitter
              23 septembre 2007 à 18:21:52

              Citation : kurt_

              En fait j'ai séparé le main de la fonction qui permet de jouer :) sinon je vais essayer les conseils de Nanoc ...



              Peut-être mais ya toujours pas de fonction pour "englober" toutes ces instructions...
              • Partager sur Facebook
              • Partager sur Twitter

              Probleme avec la SDL

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown