Apprendre sdl avec mario

Description

ce petit programme vient dans le cadre d'apprentissage de la SDL avec le C++, sur ce programme j'utilise pas la notion de classe, et je traite pas les collisions, vous pouvez l'améliorer, c'est enrichissant pour les débutants, n'hésiter pas à me contacter sur "migon.31@hotmail.fr".

Source / Exemple :


//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 de mario
const int SHEET_WIDTH = 382;
const int SHEET_HEIGHT = 1131;

//Les attributs de la feuille de sprites de mario
const int SHEET_WIDTH2 = 60;
const int SHEET_HEIGHT2 = 25;

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

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

//les premiers coordonées de mario
int posx=100,posy=415;

//le numero de l'image à afficher
int anim=0;

//proprité de l'enemie
int posx_e=0,posy_e=430, anim_e=0;

//les images de mario
SDL_Rect clip[ 10 ];

//les images des enemis
SDL_Rect clip2[ 5 ];

//charger une image 
SDL_Surface *load_image( std::string filename, int *R=NULL, int *G=NULL, int *B=NULL)
{
    //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 )
        {
          Uint32 colorkey = SDL_MapRGB( optimizedImage->format, *R, *G, *B);
          SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY,colorkey);
        }
    }

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

/*
avant je faisais une fonction de chargement pour chaque couleur de transparence ce qui n'été pas une bonne méthode ;)

//charger une image sans le vert
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 )
        {
          Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 48, 169, 66);
          SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY,colorkey);
        }
    }

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

//charger une image sans le blanc
SDL_Surface *load_image2( 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 )
        {
          Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 255, 255, 255);
          SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY,colorkey);
        }
    }

    //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|SDL_FULLSCREEN );

    //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( "JV_ ABDOU", NULL );

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

bool load_files()
{
    //Chargement de la feuille de sprite
    int r=48, g=169, b=66;
    faces = load_image( "mario.png", &r, &g, &b );
    arriere_plan = load_image( "nature.png", &r, &g, &b);
    r=255; g=255; b=255;
    enemis= load_image( "enemis.png", &r, &g, &b);
    
    //Si tout s'est bien passé
    return true;
}

void clean_up()
{
    //On libère la feuille de sprites
    SDL_FreeSurface( faces );
    SDL_FreeSurface( enemis );
    SDL_FreeSurface( arriere_plan );
    SDL_FreeSurface( screen );
              
    //On quitte SDL
    SDL_Quit();   
}

//decouper la feuille de mario
void decoupage ()
{    
    //On coupe la partie en haut à gauche (premier sprite)
    clip[ 0 ].x = SHEET_WIDTH/25;
    clip[ 0 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 0 ].w = SHEET_WIDTH/15;
    clip[ 0 ].h = SHEET_HEIGHT/30;
    
    //On coupe la partie en haut à droite (second sprite)
    clip[ 1 ].x = SHEET_WIDTH/25+SHEET_WIDTH/15;
    clip[ 1 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 1 ].w = SHEET_WIDTH/15;
    clip[ 1 ].h = SHEET_HEIGHT/30;
     
    //On coupe la partie en bas à gauche (troisième sprite)
    clip[ 2 ].x = SHEET_WIDTH/25+2*(SHEET_WIDTH/15);
    clip[ 2 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 2 ].w = SHEET_WIDTH/15-5;
    clip[ 2 ].h = SHEET_HEIGHT/30;
    
    clip[ 3 ].x = SHEET_WIDTH/25+3*(SHEET_WIDTH/15)-5;
    clip[ 3 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 3 ].w = SHEET_WIDTH/15-6;
    clip[ 3 ].h = SHEET_HEIGHT/30;
    
    clip[ 4 ].x = SHEET_WIDTH/25+4*(SHEET_WIDTH/15)-10;
    clip[ 4 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 4 ].w = SHEET_WIDTH/15-6;
    clip[ 4 ].h = SHEET_HEIGHT/30;
    
    clip[ 5 ].x = SHEET_WIDTH/25+5*(SHEET_WIDTH/15)+3;
    clip[ 5 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 5 ].w = SHEET_WIDTH/15-2;
    clip[ 5 ].h = SHEET_HEIGHT/30;
    
    clip[ 6 ].x = SHEET_WIDTH/25+6*(SHEET_WIDTH/15)-20;
    clip[ 6 ].y = 20+2*SHEET_HEIGHT/27;
    clip[ 6 ].w = SHEET_WIDTH/15-3;
    clip[ 6 ].h = SHEET_HEIGHT/30;   
    
    clip2[ 0 ].x = 0;
    clip2[ 0 ].y = 0;
    clip2[ 0 ].w = SHEET_WIDTH2/3;
    clip2[ 0 ].h = SHEET_HEIGHT2;
    
    clip2[ 1 ].x = SHEET_WIDTH2/3;
    clip2[ 1 ].y = 0;
    clip2[ 1 ].w = SHEET_WIDTH2/3;
    clip2[ 1 ].h = SHEET_HEIGHT2;    
    
    clip2[ 2 ].x = 2*SHEET_WIDTH2/3;
    clip2[ 2 ].y = 0;
    clip2[ 2 ].w = SHEET_WIDTH2/3;
    clip2[ 2 ].h = SHEET_HEIGHT2;   
    
}

//traiter les evenements
void evenement()
{
   //Obtenir les KeyStates
   Uint8 *keystates = SDL_GetKeyState( NULL );  
   bool move= false;
        if( keystates[ SDLK_UP ] )
        {
         posy-=3; 
         move= true;
        }

        //Si Bas est pressé (la fleche)
        if( keystates[ SDLK_DOWN ] )
        {
         posy+=3;
         move= true;
        }

        //Si Gauche est pressé (la fleche)
        if( keystates[ SDLK_LEFT ] )
        {
         posx-=3;
         if ( posx < 0 ) posx++;
         move= true;
        }
        
        //Si Droite est pressé (la fleche)
        if( keystates[ SDLK_RIGHT ] )
        {
         posx+=3;
         if (posx >= SCREEN_WIDTH-15 ) posx--;
         move= true;
        }     
        
    if ( move == true ) anim++;
    else anim = 6;
    if ( anim == 7) anim = 0;
}

void evenement_enemis()
{
  //cette fonction permet l'animation de l'enemis
  apply_surface( posx_e, posy_e, enemis, screen, &clip2[anim_e] );
  //changer la position de l'enemi
  posx_e++;
  //changé l'animation
  anim_e++;
  if ( posx_e == SCREEN_WIDTH ) posx_e=0;
  if (anim_e == 2 ) anim_e=0;
}     
 

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;
    }

    decoupage();
    
    //Tant que l'utilisateur n'a pas quitter
    while( quit == false )
    {   
        //preparer l'arriere plan
        apply_surface( 0, 0, arriere_plan, screen);

        //traiter les evenement clavier
        evenement();
        
        //preparer le personnage mario
        apply_surface( posx, posy, faces, screen, &clip[anim] );
        
        
        //si l'enemi n'est pas toucher
        evenement_enemis();
      
        //afficher
        SDL_Flip( screen);

        //Tant qu'il y a un événement
        while( SDL_PollEvent( &event ) )
        {
            switch (event.key.keysym.sym)
            {
              case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                                quit = true;
                                break;
            }        
        }
        
    }

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

    return 0;
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (medACK)