Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

APPRENDRE LA SDL


Information sur la source

Catégorie :Jeux Classé sous : jeu-sdl, programmation jeu, débutant jeu, apprendre SDL, jeu 2D Niveau : Initié Date de création : 10/08/2008 Date de mise à jour : 11/08/2008 16:59:25 Vu / téléchargé: 3 588 / 216

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Ceci est un petit programme que j'ai fait dans le but d'apprendre à faire des jeux en 2D.
Pour plus d'informmations ou bien pour en discuter sur le sujet voilà mon msn "migon.31@hotmail.fr".
 

Source

  • #include "SDL/SDL.h"
  • #include "SDL/SDL_image.h"
  • #include <string>
  • //Les attributs de l'écran
  • const int SCREEN_WIDTH = 238;
  • const int SCREEN_HEIGHT = 224;
  • const int SCREEN_BPP = 32;
  • //Les attributs de la feuille des sprites
  • const int SHEET_WIDTH = 602;
  • const int SHEET_HEIGHT = 1257;
  • //Les attributs du personnage
  • const int PERSONE_WIDTH = 30;
  • const int PERSONE_HEIGHT = 57;
  • //les chrono
  • int i1,i2=0;
  • //le numero de stage
  • int stage=1;
  • //etat du joue
  • bool gagner=false;
  • //Les surfaces
  • SDL_Surface *personnage_screen = NULL;
  • SDL_Surface *background = NULL;
  • SDL_Surface *bouclier = NULL;
  • SDL_Surface *porte = NULL;
  • SDL_Surface *Ganger = NULL;
  • SDL_Surface *Cle = NULL;
  • SDL_Surface *screen = NULL;
  • //La structure d'événements
  • SDL_Event event;
  • //la banque des images
  • SDL_Rect imageG[ 4 ];
  • SDL_Rect imageD[ 4 ];
  • SDL_Rect R;
  • SDL_Rect B[2];
  • SDL_Rect table;
  • SDL_Rect Porte;
  • //animation du bouclier
  • int anim_bouclier=0;
  • //effet transparence
  • int alpha = SDL_ALPHA_TRANSPARENT;
  • int alpha2 = SDL_ALPHA_OPAQUE;
  • //La classe Timer
  • class personnage
  • {
  • private:
  • //possition du personnage
  • int posx;
  • int posy;
  • //direction du joeur 1pour droite, 0pour gauche.
  • int direct;
  • //true pour actif , false pour non actif
  • bool statut;
  • //le numero d'image à afficher
  • int anim;
  • public:
  • //Le constructeur permettant l'initialisation des variables
  • personnage();
  • //traiter les evenements clavier
  • void evenement();
  • //traiter les collisions
  • bool collision (int A, SDL_Rect B);
  • //taux de rafraichissment
  • bool chrono();
  • //montrer le personnage
  • void affichage();
  • };
  • //charger une image sans le mauve
  • 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 a bien 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 surface a bien été optimisée
  • if( optimizedImage != NULL )
  • { //ne pas charger la couleur mauve
  • SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 80, 80, 224 ) );
  • }
  • }
  • //On retourne l'image optimisée
  • return optimizedImage;
  • }
  • //charger une image sans le marron
  • 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 a bien 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 surface a bien été optimisée
  • if( optimizedImage != NULL )
  • { //ne pas charger la couleur marron
  • SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 111, 79, 51 ) );
  • }
  • }
  • //On retourne l'image optimisée
  • return optimizedImage;
  • }
  • //charger une image sans le bleu nuit
  • SDL_Surface *load_image3( 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 a bien 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 surface a bien été optimisée
  • if( optimizedImage != NULL )
  • { //ne pas charger la couleur bleu nuit
  • SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 8, 33, 82));
  • }
  • }
  • //On retourne l'image optimisée
  • return optimizedImage;
  • }
  • //preparer l'ecran
  • 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 );
  • }
  • //préparer les differentes positions du personnage
  • void decoupage()
  • {
  • //arriere plan
  • R.x = 10;
  • R.y = 10;
  • R.w = 238;
  • R.h = 224;
  • //bouclier
  • B[0].x = 0;
  • B[0].y = 0;
  • B[0].w = 29.5;
  • B[0].h = 32;
  • B[1].x = 29.5;
  • B[1].y = 0;
  • B[1].w = 29.5;
  • B[1].h = 32;
  • //table
  • table.x = 102;
  • table.y = 105;
  • table.w = 60;
  • table.h = 50;
  • //personnage
  • imageG[ 0 ].x = 20;
  • imageG[ 0 ].y = 60*3;
  • imageG[ 0 ].w = PERSONE_WIDTH;
  • imageG[ 0 ].h = PERSONE_HEIGHT;
  • imageG[ 1 ].x = 20+PERSONE_WIDTH+2;
  • imageG[ 1 ].y = 60*3;
  • imageG[ 1 ].w = PERSONE_WIDTH;
  • imageG[ 1 ].h = PERSONE_HEIGHT;
  • imageG[ 2 ].x = 20*2+PERSONE_WIDTH+15;
  • imageG[ 2 ].y = 60*3;
  • imageG[ 2 ].w = PERSONE_WIDTH;
  • imageG[ 2 ].h = PERSONE_HEIGHT-3;
  • imageG[ 3 ].x = 20*3+PERSONE_WIDTH-5;
  • imageG[ 3 ].y = 60*3;
  • imageG[ 3 ].w = PERSONE_WIDTH;
  • imageG[ 3 ].h = PERSONE_HEIGHT-3;
  • imageD[ 0 ].x = 20*23-5;
  • imageD[ 0 ].y = 60*3;
  • imageD[ 0 ].w = PERSONE_WIDTH;
  • imageD[ 0 ].h = PERSONE_HEIGHT;
  • imageD[ 1 ].x = 20*23-3+PERSONE_WIDTH;
  • imageD[ 1 ].y = 60*3;
  • imageD[ 1 ].w = PERSONE_WIDTH;
  • imageD[ 1 ].h = PERSONE_HEIGHT;
  • imageD[ 2 ].x = 20*23+PERSONE_WIDTH+30;
  • imageD[ 2 ].y = 60*3;
  • imageD[ 2 ].w = PERSONE_WIDTH;
  • imageD[ 2 ].h = PERSONE_HEIGHT-3;
  • imageD[ 3 ].x = 20*23+PERSONE_WIDTH+60;
  • imageD[ 3 ].y = 60*3;
  • imageD[ 3 ].w = PERSONE_WIDTH;
  • imageD[ 3 ].h = PERSONE_HEIGHT-3;
  • //la porte
  • Porte.x = 0;
  • Porte.y = 0;
  • Porte.w = 34;
  • Porte.h = 25;
  • }
  • bool personnage::collision (int a, SDL_Rect B)
  • {
  • //collision avec la table
  • //traitement du coté droit de la table
  • if (((personnage::posx > B.x-30)&&(personnage::posx < B.x-30+table.w))&&((personnage::posy>43)&&(personnage::posy<43+table.h)))
  • return true;
  • //traitement du coté gauche de la table
  • if (((personnage::posx < B.x-30+table.w+10)&&(personnage::posx > B.x-30))&&((personnage::posy>43)&&(personnage::posy<43+table.h)))
  • return true;
  • //traitement du coté haut de la table
  • if (((personnage::posy > 43)&&(personnage::posy < 43+table.h))&&((personnage::posx>B.x-30)&&(personnage::posx<B.x-30+table.w)))
  • return true;
  • //traitement du coté bat de la table
  • if (((personnage::posy < 43+table.h)&&(personnage::posy >43))&&((personnage::posx>B.x-30)&&(personnage::posx<B.x-30+table.w)))
  • return true;
  • //collision avc les murs
  • if ((personnage::posy < 20)&&(personnage::posx <109))
  • return true;
  • if ((personnage::posy < 10)&&((personnage::posx >109)&&(personnage::posx <148)))
  • return true;
  • if ((personnage::posx > 165)&&(personnage::posy <75))
  • return true;
  • if (personnage::posx > 205)
  • return true;
  • if ((personnage::posy > 112)&&((personnage::posx <93))||((personnage::posy > 112)&&(personnage::posx >115)))
  • return true;
  • if (personnage::posy > 170)
  • return true;
  • //collision avec le bouclier
  • if((personnage::posx < 15)&&((personnage::posy >79)&&(personnage::posy <107)))
  • {
  • anim_bouclier=1;
  • return true;
  • }
  • //collision avec la porte
  • if ((anim_bouclier==0)&&((personnage::posy > 112)&&((personnage::posx >90)&&(personnage::posx <115))))
  • return true;
  • }
  • //initialisation
  • void init()
  • {
  • //Initialisation de tous les sous-système de SDL
  • SDL_Init( SDL_INIT_EVERYTHING );
  • //Mise en place de l'écran
  • screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_HWSURFACE);
  • //Mise en place de la barre caption
  • SDL_WM_SetCaption( "FILLE", NULL );
  • }
  • //chargement des fichiers
  • void load_files()
  • {
  • //Chargement
  • personnage_screen = load_image( "fille.png" );
  • background = load_image( "background.png" );
  • bouclier = load_image2( "bouclier.png" );
  • porte = load_image( "porte.png" );
  • Ganger = load_image ( "ganger.png" );
  • Cle = load_image3 ( "cle.png" );
  • }
  • //quitter
  • void clean_up()
  • {
  • //Libération des surfaces
  • SDL_FreeSurface( personnage_screen );
  • //On quitte SDL
  • SDL_Quit();
  • }
  • //initialiser le personnage
  • personnage::personnage()
  • {
  • posx = 30;
  • posy = 30;
  • anim = 0;
  • direct = 1;
  • statut = true;
  • }
  • bool personnage::chrono()
  • {
  • i1 = SDL_GetTicks();
  • if ( i1-i2 > 70)
  • {
  • i2=i1;
  • return true;
  • }
  • else return false;
  • }
  • //traiter les evenements
  • void personnage::evenement()
  • {
  • //Obtenir les KeyStates
  • Uint8 *keystates = SDL_GetKeyState( NULL );
  • bool move= false;
  • //tantque l'utilisateur na pas gagner en traite les evenements
  • if ( gagner== false)
  • {
  • if( keystates[ SDLK_UP ] )
  • {
  • posy-=3;
  • if ((posy <= 0) || (collision(posx,table)==true))
  • posy+=3;
  • move= true;
  • }
  • //Si Bas est pressé (la fleche)
  • if( keystates[ SDLK_DOWN ] )
  • {
  • posy+=3;
  • if (( posy > 535 )||(collision(posx,table)==true))
  • posy-=3;
  • move= true;
  • }
  • //Si Gauche est pressé (la fleche)
  • if( keystates[ SDLK_LEFT ] )
  • {
  • direct=0;
  • posx-=3;
  • if ((posx <= 0) || (collision(posx,table)==true))
  • posx+=3;
  • move= true;
  • }
  • //Si Droite est pressé (la fleche)
  • if( keystates[ SDLK_RIGHT ] )
  • {
  • direct=1;
  • posx+=3;
  • if ((posx >= SCREEN_WIDTH-30)||(collision(posx,table)==true))
  • posx-=3;
  • move= true;
  • }
  • }
  • if ( move == true ) anim++;
  • else anim = 0;
  • if ( anim == 4) anim = 0;
  • }
  • //préperer le personnage pour l'affichage
  • void personnage::affichage()
  • {
  • //s'il est temps pour rafraichire l'ecran et qu'on a pas encor finis le stage
  • if (/*(personnage::chrono())&&*/(gagner== false))
  • {
  • //affichage de l'arriere plan
  • apply_surface( 0, 0, background, screen, &R);
  • //afficahge du bouclier
  • apply_surface( 0, 125, bouclier, screen, &B[anim_bouclier]);
  • //affichage de la porte tant que le joueur na pa activé le bouclier
  • if ( anim_bouclier == 0 )
  • apply_surface( 102, 168, porte, screen, &Porte );
  • //affichage du personnage selon la direction
  • if ( direct == 1)
  • apply_surface( posx, posy, personnage_screen, screen, &imageD[ anim ]);
  • else
  • apply_surface( posx, posy, personnage_screen, screen, &imageG[ anim ]);
  • //affichage de la clé
  • apply_surface( 100, 195, Cle, screen);
  • }
  • //si le joueur gange
  • if(personnage::posy >160)
  • {
  • gagner = true;
  • alpha += 1;
  • SDL_SetAlpha( Ganger, SDL_SRCALPHA | SDL_RLEACCEL, alpha );
  • apply_surface( 0, 0, Ganger, screen);
  • if (alpha > 250) alpha=250;
  • //passer au stage suivant
  • stage=2;
  • }
  • }
  • //programme principal
  • int main( int argc, char* args[] )
  • {
  • //Ce qui va nous permettre de quitter
  • bool quitG=false, quit = false;
  • //Initialisation
  • init();
  • //Chargement des fichiers
  • load_files();
  • //decoupage
  • decoupage();
  • //declarer notre personnage
  • personnage fille;
  • //Tant que l'utilisateur n'a pas quitter
  • while( quit == false )
  • {
  • if( fille.chrono())
  • {
  • //traiter les evenement clavier
  • fille.evenement();
  • //afficher le personnage
  • fille.affichage();
  • 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;
  • }
  • }//end of while du traitement d'evenements clavier
  • }//end of while du premier stage
  • //On libère les images et on quitte SDL
  • clean_up();
  • return 0;
  • }
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <string>

//Les attributs de l'écran
const int SCREEN_WIDTH = 238;
const int SCREEN_HEIGHT = 224;
const int SCREEN_BPP = 32;

//Les attributs de la feuille des sprites 
const int SHEET_WIDTH = 602;
const int SHEET_HEIGHT = 1257;

//Les attributs du personnage
const int PERSONE_WIDTH = 30;
const int PERSONE_HEIGHT = 57;

//les chrono
int i1,i2=0;

//le numero de stage
int stage=1;

//etat du joue 
bool gagner=false;

//Les surfaces
SDL_Surface *personnage_screen = NULL;
SDL_Surface *background = NULL;
SDL_Surface *bouclier = NULL;
SDL_Surface *porte = NULL;
SDL_Surface *Ganger = NULL;
SDL_Surface *Cle = NULL;
SDL_Surface *screen = NULL;

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

//la banque des images
SDL_Rect imageG[ 4 ];
SDL_Rect imageD[ 4 ];
SDL_Rect R;
SDL_Rect B[2];
SDL_Rect table;
SDL_Rect Porte;

//animation du bouclier
int  anim_bouclier=0;

//effet transparence
int alpha = SDL_ALPHA_TRANSPARENT;
int alpha2 = SDL_ALPHA_OPAQUE;

//La classe Timer
class personnage
{
    private:
    //possition du personnage
    int posx;
    int posy;
    
    //direction du joeur 1pour droite, 0pour gauche.
    int direct;
    
    //true pour actif , false pour non actif
    bool statut;

   //le numero d'image à afficher
   int anim;
   

    public:
    //Le constructeur permettant l'initialisation des variables
    personnage();
    
    //traiter les evenements clavier
    void evenement();
    
    //traiter les collisions
    bool collision (int A, SDL_Rect B);
    
    //taux de rafraichissment
    bool chrono();
    
    //montrer le personnage
    void affichage();
};

//charger une image sans le mauve
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 a bien 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 surface a bien été optimisée
        if( optimizedImage != NULL )
        {   //ne pas charger la couleur mauve
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 80, 80, 224 ) );
        }
    }

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

//charger une image sans le marron
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 a bien 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 surface a bien été optimisée
        if( optimizedImage != NULL )
        {   //ne pas charger la couleur marron
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 111, 79, 51 ) );
        }
    }

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

//charger une image sans le bleu nuit
SDL_Surface *load_image3( 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 a bien 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 surface a bien été optimisée
        if( optimizedImage != NULL )
        {   //ne pas charger la couleur bleu nuit
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 8, 33, 82));
        }
    }

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


//preparer l'ecran
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 );
}

//préparer les differentes positions du personnage
void decoupage()
{
    //arriere plan
    R.x = 10;
    R.y = 10;
    R.w = 238;
    R.h = 224;
    
    //bouclier
    B[0].x = 0;
    B[0].y = 0;
    B[0].w = 29.5;
    B[0].h = 32;
    
    B[1].x = 29.5;
    B[1].y = 0;
    B[1].w = 29.5;
    B[1].h = 32;
    
    //table
    table.x = 102;
    table.y = 105;
    table.w = 60;
    table.h = 50;
    
    //personnage
    imageG[ 0 ].x = 20;
    imageG[ 0 ].y = 60*3;
    imageG[ 0 ].w = PERSONE_WIDTH;
    imageG[ 0 ].h = PERSONE_HEIGHT;
    
    imageG[ 1 ].x = 20+PERSONE_WIDTH+2;
    imageG[ 1 ].y = 60*3;
    imageG[ 1 ].w = PERSONE_WIDTH;
    imageG[ 1 ].h = PERSONE_HEIGHT;
    
    imageG[ 2 ].x = 20*2+PERSONE_WIDTH+15;
    imageG[ 2 ].y = 60*3;
    imageG[ 2 ].w = PERSONE_WIDTH;
    imageG[ 2 ].h = PERSONE_HEIGHT-3;
    
    imageG[ 3 ].x = 20*3+PERSONE_WIDTH-5;
    imageG[ 3 ].y = 60*3;
    imageG[ 3 ].w = PERSONE_WIDTH;
    imageG[ 3 ].h = PERSONE_HEIGHT-3;
    
    imageD[ 0 ].x = 20*23-5;
    imageD[ 0 ].y = 60*3;
    imageD[ 0 ].w = PERSONE_WIDTH;
    imageD[ 0 ].h = PERSONE_HEIGHT;
    
    imageD[ 1 ].x = 20*23-3+PERSONE_WIDTH;
    imageD[ 1 ].y = 60*3;
    imageD[ 1 ].w = PERSONE_WIDTH;
    imageD[ 1 ].h = PERSONE_HEIGHT;
    
    imageD[ 2 ].x = 20*23+PERSONE_WIDTH+30;
    imageD[ 2 ].y = 60*3;
    imageD[ 2 ].w = PERSONE_WIDTH;
    imageD[ 2 ].h = PERSONE_HEIGHT-3;
    
    imageD[ 3 ].x = 20*23+PERSONE_WIDTH+60;
    imageD[ 3 ].y = 60*3;
    imageD[ 3 ].w = PERSONE_WIDTH;
    imageD[ 3 ].h = PERSONE_HEIGHT-3;
    
    //la porte
    Porte.x = 0;
    Porte.y = 0;
    Porte.w = 34;
    Porte.h = 25;

}

bool personnage::collision (int a, SDL_Rect B)
{
   //collision avec la table
   //traitement du coté droit de la table
   if (((personnage::posx > B.x-30)&&(personnage::posx < B.x-30+table.w))&&((personnage::posy>43)&&(personnage::posy<43+table.h)))
         return true;
      
   //traitement du coté gauche de la table
   if (((personnage::posx < B.x-30+table.w+10)&&(personnage::posx > B.x-30))&&((personnage::posy>43)&&(personnage::posy<43+table.h)))
         return true;
     
   //traitement du coté haut de la table
   if (((personnage::posy > 43)&&(personnage::posy < 43+table.h))&&((personnage::posx>B.x-30)&&(personnage::posx<B.x-30+table.w)))
         return true;
     
   //traitement du coté bat de la table
   if (((personnage::posy < 43+table.h)&&(personnage::posy >43))&&((personnage::posx>B.x-30)&&(personnage::posx<B.x-30+table.w)))
         return true;
   
   //collision avc les murs
   if ((personnage::posy < 20)&&(personnage::posx <109))
         return true;
   if ((personnage::posy < 10)&&((personnage::posx >109)&&(personnage::posx <148)))
         return true;
   if ((personnage::posx > 165)&&(personnage::posy <75))
         return true;
   if (personnage::posx > 205)
         return true;
   if ((personnage::posy > 112)&&((personnage::posx <93))||((personnage::posy > 112)&&(personnage::posx >115)))
         return true;
   if (personnage::posy > 170)
         return true;   
         
   //collision avec le bouclier
   if((personnage::posx < 15)&&((personnage::posy >79)&&(personnage::posy <107))) 
     {    
         anim_bouclier=1;
         return true;
     }
   
   //collision avec la porte
   if ((anim_bouclier==0)&&((personnage::posy > 112)&&((personnage::posx >90)&&(personnage::posx <115)))) 
        return true;                          
}   



//initialisation
void init()
{
    //Initialisation de tous les sous-système de SDL
    SDL_Init( SDL_INIT_EVERYTHING );

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

    //Mise en place de la barre caption
    SDL_WM_SetCaption( "FILLE", NULL );
}

//chargement des fichiers
void load_files()
{
    //Chargement 
    personnage_screen = load_image( "fille.png" );
    
    background = load_image( "background.png" );
    
    bouclier = load_image2( "bouclier.png" );
    
    porte = load_image( "porte.png" );
    
    Ganger = load_image ( "ganger.png" );
    
    Cle = load_image3 ( "cle.png" );
}

//quitter 
void clean_up()
{
    //Libération des surfaces 
    SDL_FreeSurface( personnage_screen );

    //On quitte SDL
    SDL_Quit();
}

//initialiser le personnage
personnage::personnage()
{
   posx = 30;
   posy = 30;
   anim = 0;
   direct = 1;
   statut = true;
}

bool personnage::chrono()
{
  i1 = SDL_GetTicks();
  if ( i1-i2 > 70)
  {
    i2=i1;
    return true;
  }
  else return false;
}       
     
//traiter les evenements
void personnage::evenement()
{
   //Obtenir les KeyStates
   Uint8 *keystates = SDL_GetKeyState( NULL );  
   bool move= false;  
   //tantque l'utilisateur na pas gagner en traite les evenements
   if ( gagner== false)
   {
        if( keystates[ SDLK_UP ] )
        {
         posy-=3;
         if ((posy <= 0) || (collision(posx,table)==true))
            posy+=3;
         move= true;
        }

        //Si Bas est pressé (la fleche)
        if( keystates[ SDLK_DOWN ] )
        {
          posy+=3;
          if (( posy > 535 )||(collision(posx,table)==true))
          posy-=3;
         move= true;
        }

        //Si Gauche est pressé (la fleche)
        if( keystates[ SDLK_LEFT ] )
        {
         direct=0;
         posx-=3;
         if ((posx <= 0) || (collision(posx,table)==true))
          posx+=3;
         move= true;
        }
        
        //Si Droite est pressé (la fleche)
        if( keystates[ SDLK_RIGHT ] )
        {
         direct=1;
         posx+=3;
         if ((posx >= SCREEN_WIDTH-30)||(collision(posx,table)==true))
         posx-=3;
         move= true;
        }
    }    
    if ( move == true ) anim++;
    else anim = 0;
    if ( anim == 4) anim = 0;

}

//préperer le personnage pour l'affichage 
void personnage::affichage()
{
     //s'il est temps pour rafraichire l'ecran et qu'on a pas encor finis le stage
     if (/*(personnage::chrono())&&*/(gagner== false))
     {
     
     //affichage de l'arriere plan
     apply_surface( 0, 0, background, screen, &R);
     
     //afficahge du bouclier
     apply_surface( 0, 125, bouclier, screen, &B[anim_bouclier]);
     
     //affichage de la porte tant que le joueur na pa activé le bouclier
     if ( anim_bouclier == 0 )  
       apply_surface( 102, 168, porte, screen, &Porte );
     
     
    //affichage du personnage selon la direction 
     if ( direct == 1)
        apply_surface( posx, posy, personnage_screen, screen, &imageD[ anim ]);
     else
        apply_surface( posx, posy, personnage_screen, screen, &imageG[ anim ]);
     
     //affichage de la clé
     apply_surface( 100, 195, Cle, screen);      
     }
     
     //si le joueur gange
     if(personnage::posy >160)
     {
       gagner = true;
       alpha += 1;
       SDL_SetAlpha( Ganger, SDL_SRCALPHA | SDL_RLEACCEL, alpha );
       apply_surface( 0, 0, Ganger, screen);
       if (alpha > 250) alpha=250;
       //passer au stage suivant
       stage=2;       
     }       
}


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

    //Chargement des fichiers
    load_files();
    
    //decoupage
    decoupage();
    
    //declarer notre personnage
    personnage fille;  
         
   //Tant que l'utilisateur n'a pas quitter
   while( quit == false )
           {   
               
               if( fille.chrono())
               {
               //traiter les evenement clavier
               fille.evenement();   
 
               //afficher le personnage
               fille.affichage();   

               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;
                  }        
               }//end of while du traitement d'evenements clavier
        
           }//end of while du premier stage
                  
   //On libère les images et on quitte SDL
   clean_up();

   return 0;
}







Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

11 août 2008 16:59:25 :
suite à une erreur dans l'orthographe

Commentaires et avis

signaler à un administrateur
Commentaire de unionx le 11/08/2008 03:53:31

trop facile a faire ces trucs en SDL, mais dis moi tu sais comment faire pour créer une barre de progresse( une barre de chargement des surfaces )?

j'aimerai connaitre si il a une fonction qui mesure le chargement de la surface dans la RAM.

signaler à un administrateur
Commentaire de medACK le 11/08/2008 11:53:47

salut UNIONX,
d'abord merci pour le commentaire, et en se qui concerne ta question, j'ai jamais pensé à faire se que tu demande, car le chargement des surfaces est rapide et se fait avant le début de la boucle du jeu, donc c'est pas important de savoir le temps du chargement, et en plus si tu veut plus de rapidité il te faux agrandir la RAM,j'éspere t'avoir répondu, sinon n'hésite pas à demander  

signaler à un administrateur
Commentaire de unionx le 11/08/2008 20:06:53

hmm essaye de charger 12 bitmaps a la fois et une chanson mp3 et tu vas voir qu'il a un délai important , ce délai change du pc a l'autre ( ca dépendant de la ram ).

baaah je pense a tout le monde ;-)
pour avoir un bon projet !!! il faut surement pense au configuration minimum de la ram.

bonne continuation.

signaler à un administrateur
Commentaire de medACK le 11/08/2008 20:46:27

Ecoute si ça t'intéresse vraiment, tu peux maitre ceci dans ta fonction par exemple :

void chargement()
{
   //tu met ici le nbr de choses que tu veux charger
   int NBR = .... ;
   //on déclare un compteur
   int i = 0;
   //on declare une variable pour le calcul du taux
   int x = 0;
   //charger la 1ere image
   premiere = load_image( "1ere.png" );
   x = (i / NBR)*100; //ici tu ora "0 %"
   //charger la 2eme image
   deuxieme = load_image( "2eme.png" );
   x = (i++ / NBR)*100; //ici tu ora exemple "10%"
   .....
   //et tu répete cette drniere ligne
   .....

}  
  
n'hésite pas si ça te convient pas.  

signaler à un administrateur
Commentaire de unionx le 12/08/2008 15:49:53

merci, j'ai dejà fais presque la meme chose mais j'avais eu un probleme !!!

le chargement va ce passé meme si les surfaces n'est pas charger au mémoire.

bon zappe ce que je dis, car sa fait 2ans que je n'est pas touché la Lib SDL, je veux juste avoir une idée a ce que j'avais pas réalisé avant, mais bon merci et bonne continuation.

signaler à un administrateur
Commentaire de medACK le 12/08/2008 16:06:06

UNIONX j'aime pas lésser des questions sans réponses, donc voilà une solution complete à ton probleme:

//si tout se passe bien on aura 0
int chargement()
{
   //tu met ici le nbr de choses que tu veux charger
   int NBR = .... ;
   //on déclare un compteur
   int i = 0;
   //on declare une variable pour le calcul du taux
   int x = 0;
   //charger la 1ere image
   premiere = load_image( "1ere.png" );
   //on test si le chargement s'est bien éffectuer
   if ( premier!=NULL )
        x = (i / NBR)*100; //ici tu ora "0 %"
   //sinon on renvoi 1 est on sort
   else
        return 1;  
   //charger la 2eme image
   deuxieme = load_image( "2eme.png" );
   if ( deuxieme!=NULL )
        x = (i++ / NBR)*100; //ici tu ora exemple "10%"
   else
        return 1;
   .....
   //et tu répete cette drniere ligne
   .....
   //si tout c'est bien se passé on renvois 0
   return 0;
}

Quand tu test tes surfaces et tu les trouveras differentes de NULL
ça voudra dire que le chargement c'est effectuer;
voilà voisin et merci pour l'encouragement.  

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 03:50:15

Salut,
ton programme ne fonctionne pas chez moi.
la fenêtre reste noir.

signaler à un administrateur
Commentaire de zenobiusz le 18/08/2008 11:43:16 10/10

Good job ;) 10/10

signaler à un administrateur
Commentaire de medACK le 18/08/2008 13:24:49

Merci "ZENOBIUSZ".

signaler à un administrateur
Commentaire de medACK le 18/08/2008 13:28:23

"SNIPER" j'ai moi même télécharger le ZIP pour voir et ça marcher chez moi, tu as essayé de le compiler?, sinon contacte moi, mon e-mail est citer en haut, peut être que tu as besoin d'une "dll"!.

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 14:06:15

non j'ai bien toute les dll je suis aussi sous dev-cpp il n'y a pas d'erreur de compilation ni d'avertissement la fenêtre reste toute noir et prend 50% de pross,
je suis sous vista es que ça peut faire un truc je ne sais pas.

signaler à un administrateur
Commentaire de medACK le 18/08/2008 14:22:29

moi je sous XP, et quand je le lance ça s'ouvre et reste 3secondes en noire puis vient le jeu, il charge 6 images avant la boucle principale, ça doit être la cause.
le OS n'est pas le problème ça c'est sûr, essaye cela:

efface cette ligne :

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_HWSURFACE);

et met cella:

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

tiens moi au courant ;).


signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 14:29:31

sa ne change pas, et j'ai remarquer que j'étais quand même dans la boucle on dirai qu'il ne charge pas les images je vais faire un ou deux teste et je te redis ça.

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 14:34:34

effectivement les images ne se charge pas.

signaler à un administrateur
Commentaire de medACK le 18/08/2008 15:00:33

Ta combien de mémoire sur ta RAM?
quelle est la capacité de ta carte graphique?
lance le jeu est laisse le, et je sûr que ça va s'afficher...

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 15:03:03

2Go
ok je le laisse un moment pour voir

signaler à un administrateur
Commentaire de medACK le 18/08/2008 15:19:18

c'est bien 2Go, mais je pensse que t'as un probleme de mémoire, soit à cause de Vista (car il demande trop de memoire pour le beau affichage qu'il donne), ou bien à cause d'un virus (j'éspere que ça sera pas le cas!).
tiens moi au courant si ça marche.
sinon j'aimerai savoir qu'elle sont les autres bibliotheques disponibles pour améliorés mon jeu de 2D ( SxDL,....).

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 15:29:14

un virus j'en ais bien peur mais mon pc fait des truc louche de puis quelque temps enfin.
pour améliorés si tu veux que ça sois portable je vois que avoir des image de haut qualité et de grand taille pour avoir un meilleur rendu sinon, directx est (sous windows) plus performant.

signaler à un administrateur
Commentaire de medACK le 18/08/2008 15:39:45

DirectX, c'est un loin à ma porter la 3D, je préfere rester avec la SDL, et puis quand je passera à la 3D je pensrai plutot à OpenGL (elle est portable, DirectX ne fonctionne que sous WINDOWS).
Si tu pense que ton ordi est infecté et que ton anti-virus ne détecte rien (c'est ce qui m'arrive souvent) je te conseille "ComboFix".

signaler à un administrateur
Commentaire de snpier wolf le 18/08/2008 16:01:16

merci bien je vais regarder ça.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.