Partage
  • Partager sur Facebook
  • Partager sur Twitter

Du C++ au C

Convertion C++/C

    8 août 2006 à 12:23:52

    Bonjour à tous

    Voila je vient de trouver un bout de code sur internet qui permet de découper les sprites il marche mais le probleme c'est que je n'arrive pas à le compredre dans sa totalité du fait qu'il soit écrit en C++ et je voulait vous demander si quelqu'un pouvait me convertir ce code en C. Pour faire simple me réecrire les morceaux de C++ en C voila ...

    /*******************************************************/
    /** Programme de PERRUCHON Romain pour developpez.com **/
    /**        Chapitre VI : Feuille de Sprites           **/
    /*******************************************************/

    //Les fichiers d'entête
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <string>

    //Les attributs de l'écran (640 * 480)
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const int SCREEN_BPP = 32;

    //Les attributs de la feuille de sprites
    const int SHEET_WIDTH = 200;
    const int SHEET_HEIGHT = 200;

    //Les surfaces
    SDL_Surface *faces = NULL;
    SDL_Surface *screen = NULL;

    //La structure d'événements
    SDL_Event event;

    //Les différentes parties de la feuille de sprites qui vont être blitté
    SDL_Rect clip[ 4 ];

    SDL_Surface *load_image( std::string filename )
    {
        //L'image qui est chargée
        SDL_Surface* loadedImage = NULL;

        //L'image optimisée qu'on va utiliser
        SDL_Surface* optimizedImage = NULL;

        //Chargement de l'image
        loadedImage = IMG_Load( filename.c_str() );

        //Si l'image est chargée
        if( loadedImage != NULL )
        {
            //Création de l'image optimisée
            optimizedImage = SDL_DisplayFormat( loadedImage );

            //Libération de l'ancienne image
            SDL_FreeSurface( loadedImage );

            //Si la création de l'image optimisée s'est bien passée
            if( optimizedImage != NULL )
            {
                SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
            }
        }

        //On retourne l'image optimisée
        return optimizedImage;
    }

    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
    {
        SDL_Rect offset;

        offset.x = x;
        offset.y = y;

        //On blitte la surface
        SDL_BlitSurface( source, clip, destination, &offset );
    }

    bool init()
    {
        //Initialisation de tous les sous-systèmes de SDL
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
        {
            return false;
        }

        //Mise en place de l'écran
        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

        //S'il y a une erreur lors de la mise en place de l'écran
        if( screen == NULL )
        {
            return false;
        }

        //Mise en place de la barre caption
        SDL_WM_SetCaption( "Split the faces", NULL );

        //Si tout s'est bien passé
        return true;
    }

    bool load_files()
    {
        //Chargement de la feuille de sprite
        faces = load_image( "faces.png" );

        //S'il y a eu un problème au chargement de la feuille de sprites
        if( faces == NULL )
        {
            return false;
        }

        //Si tout s'est bien passé
        return true;
    }

    void clean_up()
    {
        //On libère la feuille de sprites
        SDL_FreeSurface( faces );

        //On quitte SDL
        SDL_Quit();
    }

    int main( int argc, char* args[] )
    {
        //Ce qui va nous permettre de quitter
        bool quit = false;

        //Initialisation
        if( init() == false )
        {
            return 1;
        }

        //Chargement des fichiers
        if( load_files() == false )
        {
            return 1;
        }

        //On coupe la partie en haut à gauche (premier sprite)
        clip[ 0 ].x = 0;
        clip[ 0 ].y = 0;
        clip[ 0 ].w = SHEET_WIDTH/2;
        clip[ 0 ].h = SHEET_HEIGHT/2;

        //On coupe la partie en haut à droite (second sprite)
        clip[ 1 ].x = SHEET_WIDTH/2;
        clip[ 1 ].y = 0;
        clip[ 1 ].w = SHEET_WIDTH/2;
        clip[ 1 ].h = SHEET_HEIGHT/2;

        //On coupe la partie en bas à gauche (troisième sprite)
        clip[ 2 ].x = 0;
        clip[ 2 ].y = SHEET_HEIGHT/2;
        clip[ 2 ].w = SHEET_WIDTH/2;
        clip[ 2 ].h = SHEET_HEIGHT/2;

        //On coupe la partie en bas à droite (quatrième sprite)
        clip[ 3 ].x = SHEET_WIDTH/2;
        clip[ 3 ].y = SHEET_HEIGHT/2;
        clip[ 3 ].w = SHEET_WIDTH/2;
        clip[ 3 ].h = SHEET_HEIGHT/2;

        //On remplit l'écran de blanc
        SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );

        //On applique les sprites sur l'écran
        apply_surface( 0, 0, faces, screen, &clip[ 0 ] );
        apply_surface( SCREEN_WIDTH-(SHEET_WIDTH/2), 0, faces, screen, &clip[ 1 ] );
        apply_surface( 0, SCREEN_HEIGHT-(SHEET_HEIGHT/2), faces, screen, &clip[ 2 ] );
        apply_surface( SCREEN_WIDTH-(SHEET_WIDTH/2), SCREEN_HEIGHT-(SHEET_HEIGHT/2), faces, screen, &clip[ 3 ] );

        //Mise à jour de l'écran
        if( SDL_Flip( screen ) == -1 )
        {
            return 1;
        }

        //Tant que l'utilisateur n'a pas quitter
        while( quit == false )
        {
            //Tant qu'il y a un événement
            while( SDL_PollEvent( &event ) )
            {
                //Si l'utilisateur à appuyer sur le X de la fenêtre
                if( event.type == SDL_QUIT )
                {
                    //On quitte le programme
                    quit = true;
                }
            }
        }

        //On libère les images et on quitte SDL
        clean_up();

        return 0;
    }


    Merci d'avance et a plus

    ps: Je sais pas si c'est vraiment du C++ mais le main et en .cpp et quand je met en .c sa se compile pas.
    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2006 à 12:33:07

      Il n'y pas vraiment beaucoup de C++. :)

      bool init( )


      Le type booléen qui ne peut avoir que deux valeurs : true ou false.


      #include <string>


      Les strings qui sont spécifiques au C++, il s'en sert pour gérer une chaine de caractères.
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2006 à 12:35:51

        Salut,

        Essaye de :

        - renommer le fichier de .cpp en .c

        - supprimer
        #include <string>


        - transformer
        SDL_Surface *load_image( std::string filename )

        en
        SDL_Surface *load_image( cont char* filename )


        - transformer
        loadedImage = IMG_Load( filename.c_str() );

        en
        loadedImage = IMG_Load( filename );


        EDIT: pour les bool tu n'as qu'à ajouter en haut du fichier:

        #define bool int
        #define true 1
        #define false 0


        Si ça ne compile pas, copie/colle les erreurs.

        a+

        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2006 à 12:56:43

          Merci bien maintenant sa marche :)
          • Partager sur Facebook
          • Partager sur Twitter

          Du C++ au C

          × 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