Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL Affichage

Rien ne s'affiche...

Sujet résolu
    22 août 2006 à 22:59:35

    EDITJ'ai resolu le problème seul... d'ailleurs la solution que j'ai trouvée est bizarre, je la posterai si j'ai le temps...


    Bonjour les Zér0s,

    J'ai un gros problème... En effet, j'essaye de creer un RPG. Les mouvements marchaient, mais j'ai tenté de les animer, grace a une technique a ma facon(j'aime bien compliquer :p )

    Mais voila, malgré tous les tests que j'ai faits, et qui montrent que tout va bien, rien ne s'affiche... Pouriez vous m'aider? Et je vous remercie d'avance car c'est un truc qui prend du temps a regarder.... Voila mon code:

    Main.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "variables.h"
    #include "SDL_fonctions.h"

    int main(int argc, char *argv[])
    {
        //-----------------------------------Initialisation SDL
        SDL_Surface *ecran = NULL;
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Phoenix", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        //------------------------------------MENU
        SDL_Surface *menu = IMG_Load("menu.bmp");
        SDL_Rect position;
        position.x = 0;
        position.y = 0;
        SDL_Event event;
        int continuer = 1, choix = 0, finProgramme = 0;
        while(continuer)
        {
            effacerEcran(ecran);
            SDL_BlitSurface(menu, NULL, ecran, &position);
            SDL_Flip(ecran);
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                            case SDLK_ESCAPE:
                            continuer = 0;
                            break;

                            case SDLK_RETURN:
                            continuer = 1;
                            choix = 1;
                            break;

                            default:
                            continuer = 1;
                            break;
                    }
                break;

                case SDL_QUIT:
                    continuer = 0;
                break;

             }
                //------------------------------------Evenements de jeu(Boucle principale de jeu)
            if(choix == 1)
            {
                finProgramme = jouer(ecran);
                choix = 0;
            }
            if(finProgramme == 1)
            {
                continuer = 0;
            }
        }
        //------------------------------------Fin du jeu
        SDL_Quit();
        SDL_FreeSurface(menu);
        return EXIT_SUCCESS;
    }


    SDL_Fonctions.c

    #include <SDL/SDL.h>
    #include "variables.h"
    #include <SDL/SDL_image.h>

    void effacerEcran(SDL_Surface *ecran)
    {
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    }

    void deplacerPersonnage(int direction, SDL_Rect *pos, Emplacement map[][NB_CASES_HAUTEUR])
    {

        long j = 0, i= 0;

        if(direction == HAUT)
        {
            if(map[pos->x][pos->y - 1].traversable == 1 && pos->y - 1 >= 0)
            {
                pos->y--;
            }
        }
        else if(direction == BAS)
        {
          if(map[pos->x][pos->y + 1].traversable == 1 && pos->y + 1 < NB_CASES_HAUTEUR)
            {
                pos->y++;
            }
        }
        else if(direction == DROITE)
        {
            if(map[pos->x + 1][pos->y].traversable == 1 && pos->x + 1  < NB_CASES_HAUTEUR)
            {
                pos->x++;
            }
        }
        else if(direction == GAUCHE)
        {
            if(map[pos->x -1][pos->y].traversable == 1 && pos->x - 1 >=0)
            {
                pos->x--;
            }
        }
    }

    int jouer(SDL_Surface *ecran)
    {
        //----------------------------------------Variables
        long i = 0, j = 0, a = 0;
        long objetActuel = 0, fondActuel = 0, traversable = 0;
        int continuer = 1;
        int finProgramme = 0;
        long blitActuel[4] = {0};
        SDL_Surface *personnage = NULL;
        SDL_Rect positionBlit;
        positionBlit.x = 0;
        positionBlit.y = 0;
        SDL_Event event;
        SDL_Rect XY_personnage, positionPersonnage;
        XY_personnage.x = 0;
        XY_personnage.y = 0;
        positionPersonnage.x = 0;
        positionPersonnage.y = 0;
        Emplacement map[NB_CASES_LARGEUR][NB_CASES_HAUTEUR] = {0};
        //-------------------------------------Chargement Niveau
        FILE* niveau = NULL;
        niveau = fopen("niveau.txt", "r+");
        if(niveau != NULL)
        {
            for(j = 0; j < NB_CASES_HAUTEUR; j++)
            {
                for(i = 0; i < NB_CASES_LARGEUR; i++)
                {
                    fscanf(niveau, "%ld ", &fondActuel);
                    fscanf(niveau, "%ld ", &objetActuel);
                    fscanf(niveau, "%ld ", &traversable);
                    map[j][i].fond = fondActuel;
                    map[j][i].objet = objetActuel;
                    map[j][i].traversable = traversable;
                }
                i = 0;
            }
        }
        else
        {
            fprintf(stderr, "Erreur chargement niveau");
        }
        //-------------------------------------Initialisation Personnage et decor
        personnage = IMG_Load("personnage.bmp");
        SDL_SetColorKey(personnage, SDL_SRCCOLORKEY, SDL_MapRGB(personnage->format, 255, 0, 255));
        SDL_EnableKeyRepeat(50, 50);
        SDL_Rect posB;
        posB.x = 0;
        posB.y = 0;
        while(continuer)
        {
                SDL_WaitEvent(&event);
                switch(event.type)
                {
                        case SDL_KEYDOWN:
                            switch(event.key.keysym.sym)
                            {
                                    case SDLK_ESCAPE:
                                    continuer = 0;
                                    break;

                                    case SDLK_UP:
                                    deplacerPersonnage(HAUT, &positionPersonnage, map);
                                    blitActuel[BAS] = 0;
                                    blitActuel[GAUCHE] = 0;
                                    blitActuel[DROITE] = 0;
                                    if(blitActuel[HAUT] < 3)
                                    {
                                        blitActuel[HAUT]++;
                                    }
                                    else
                                    {
                                        blitActuel[HAUT] = 0;
                                    }
                                    positionBlit.y = HAUT * TAILLE_BLOC;
                                    positionBlit.x = blitActuel[HAUT] * TAILLE_BLOC;
                                    break;

                                    case SDLK_DOWN:
                                    deplacerPersonnage(BAS, &positionPersonnage, map);
                                    blitActuel[HAUT] = 0;
                                    blitActuel[GAUCHE] = 0;
                                    blitActuel[DROITE] = 0;
                                    if(blitActuel[BAS] < 3)
                                    {
                                        blitActuel[BAS]++;
                                    }
                                    else
                                    {
                                            blitActuel[BAS] = 0;
                                    }
                                    positionBlit.y = BAS * TAILLE_BLOC;
                                    positionBlit.x = blitActuel[BAS] * TAILLE_BLOC;
                                    break;

                                    case SDLK_LEFT:
                                    deplacerPersonnage(GAUCHE, &positionPersonnage, map);
                                    blitActuel[BAS] = 0;
                                    blitActuel[HAUT] = 0;
                                    blitActuel[DROITE] = 0;
                                    if(blitActuel[GAUCHE] < 3)
                                    {
                                        blitActuel[GAUCHE]++;
                                    }
                                    else
                                    {
                                        blitActuel[GAUCHE] = 0;
                                    }
                                    positionBlit.y = GAUCHE * TAILLE_BLOC;
                                    positionBlit.x = blitActuel[GAUCHE] * TAILLE_BLOC;
                                    break;

                                    case SDLK_RIGHT:
                                    deplacerPersonnage(DROITE, &positionPersonnage, map);
                                    blitActuel[BAS] = 0;
                                    blitActuel[GAUCHE] = 0;
                                    blitActuel[HAUT] = 0;
                                    if(blitActuel[DROITE] < 3)
                                    {
                                        blitActuel[DROITE]++;
                                    }
                                    else
                                    {
                                        blitActuel[DROITE] = 0;
                                    }
                                    positionBlit.x = blitActuel[DROITE] *  TAILLE_BLOC;
                                    positionBlit.y = DROITE * TAILLE_BLOC;
                                    break;

                                    default:
                                    break;
                            }
                        break;

                        case SDL_QUIT:
                        continuer = 0;
                        finProgramme = 1;
                        break;
                }
                effacerEcran(ecran);
                XY_personnage.x = positionPersonnage.x * TAILLE_BLOC;
                XY_personnage.y = positionPersonnage.y * TAILLE_BLOC;
                personnage->w = positionBlit.x + TAILLE_BLOC;
                personnage->h = positionBlit.y + TAILLE_BLOC;
                SDL_BlitSurface(personnage, &positionBlit, ecran, &XY_personnage);
                SDL_Flip(ecran);
        }
        SDL_FreeSurface(personnage);
        fclose(niveau);
        return finProgramme;
    }


    SDL_Fonctions.h

    #include <SDl/SDL.h>
    #include <SDL/SDL_image.h>

    int jouer(SDL_Surface *ecran);

    void effacerEcran(SDL_Surface *ecran);

    void deplacerPersonnage(int direction, SDL_Rect *pos, Emplacement map[][NB_CASES_HAUTEUR]);


    Variables.h

    #ifndef DEF_CONSTANTES
    #define DEF_CONSTANTES

        #define TAILLE_BLOC         50 // Taille d'un bloc (carré) en pixels
        #define NB_CASES_LARGEUR    10
        #define NB_CASES_HAUTEUR    10
        #define LARGEUR_FENETRE     TAILLE_BLOC * NB_CASES_LARGEUR
        #define HAUTEUR_FENETRE     TAILLE_BLOC * NB_CASES_HAUTEUR

        typedef enum Fond Fond;
        enum Fond
        {
            HERBE, SABLE, TERRE, TAPIS, BOUE, PARQUET, EAU
        };

        typedef enum Objet Objet;
        enum Objet
        {
            VIDE, PERSONNE, PIERRE, TROU, PORTE, MUR
        };

        enum {HAUT = 0, BAS = 1, GAUCHE = 2, DROITE = 3};

        typedef struct Emplacement Emplacement;
        struct Emplacement
        {
          Fond fond;
          Objet objet;
          int traversable;
        };
    #endif


    PS: Quand a la fin de la boucle principale des evenements de la fonction jouer, je modifie la ligne de blit du personnage ainsi:

    SDL_BlitSurface(personnage, NULL, ecran, &XY_personnage);

    Cela marche... Je vous remercie encore une fois de m'avoir lu...
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2006 à 7:04:47

      Quand tu as résolu ton problème, mets le en résolu, ça évite de l'ouvrir :)
      • Partager sur Facebook
      • Partager sur Twitter
        23 août 2006 à 19:59:21

        Oui désolé petit oubli :)
        • Partager sur Facebook
        • Partager sur Twitter

        SDL Affichage

        × 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