Bibliothèque SDL

Signaler
Messages postés
2
Date d'inscription
dimanche 19 octobre 2008
Statut
Membre
Dernière intervention
13 mai 2012
-
Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Statut
Membre
Dernière intervention
27 novembre 2010
-
Bonsoir à tous, je bosse en ce moment sur un petit démineur en SDL, donc je viens de commencer dessus, et mon code me génère une exception non gérée.
Donc dès que j'appuie sur '1', j'aimerais créer une nouvelle surface, game, afin de blitter dessus mes bmp.
Donc, je bloque à l'affichage de la surface game
voilà mon code:

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>

 
void init(TTF_Font *police,SDL_Surface *ecran);
void event_handler(SDL_Surface *ecran);//,SDL_Surface *game);
void jouer(SDL_Surface *ecran, SDL_Surface *game);

int main(int argc, char *argv[])
{
SDL_Surface *ecran NULL,*game NULL;
    TTF_Font *police = NULL;   

init(police, ecran);
event_handler(ecran);


TTF_CloseFont(police);
TTF_Quit();
    SDL_Quit();
    return EXIT_SUCCESS;
}

void init(TTF_Font *police, SDL_Surface *ecran)
{

SDL_Color white = {255, 255, 255};

SDL_Surface *play NULL, *help NULL;
    SDL_Rect position;

    
    SDL_Init(SDL_INIT_VIDEO);
TTF_Init();

police = TTF_OpenFont("Harabara.ttf", 20);
    ecran SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);		//170 * 255 sizeof the original;
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
play = TTF_RenderText_Blended(police, "1:  Jouer", white);
help = TTF_RenderText_Blended(police, "2: Aide", white);
    SDL_WM_SetCaption("Demineur", NULL);
position.x = 50;
position.y = 50;
SDL_BlitSurface(play, NULL, ecran, &position); 
position.x = 50;
position.y = 90;
SDL_BlitSurface(help, NULL, ecran, &position);

    SDL_Flip(ecran);

}

void event_handler(SDL_Surface *ecran,SDL_Surface *game)
{
SDL_Event event;
    int keep = 1;


while(keep)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                keep = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_q:
                        keep = 0;
                        break;
case SDLK_1:
jouer(ecran,game);
break;
                }
                break;
        }        
    }
}

void jouer(SDL_Surface *ecran, SDL_Surface *game)
{
SDL_Rect positiongame;

positiongame.x = 0;
positiongame.y = 0;

game = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 32, 0, 0, 0, 0);
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(game, NULL, ecran, &positiongame);
SDL_Flip(ecran);
//SDL_FreeSurface(game);

}

2 réponses

Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Statut
Membre
Dernière intervention
27 novembre 2010

As tu essayé de débugger pas à pas l'éxecution ? Quand tu rentre dans la fonction jouer, tes 2 paramètres d'entrée sont des pointeurs null, quand tu fais init(police,ecran), tu ne récupère pas un 'ecran' initialisé.

Il faudrait que ta fonction init retourne le pointeur 'ecran'. J'espère que c'est assez clair ?
Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Statut
Membre
Dernière intervention
27 novembre 2010

Si tu préfère la réponse en code, ta fonction Init ressemblera à :

SDL_Surface * init()
{
SDL_Surface * ptrEcran;
...
return ptrEcran;
}

et tu l'appelle : SDL_Surface *ecran=init();

Je présume que ta surface game s'initialise dans jouer(), il faudra surement faire pareil.

Sur le principe, il faut que ton main 'connaisse' toutes tes surfaces et que tu ait un module qui se charge de la création, un module qui se charge de l'affichage, et un module qui se charge des intéractions du joueur.