Bibliothèque SDL

haarp6 Messages postés 2 Date d'inscription dimanche 19 octobre 2008 Statut Membre Dernière intervention 13 mai 2012 - 24 nov. 2010 à 21:14
cs_Ballesteros Messages postés 11 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 27 novembre 2010 - 24 nov. 2010 à 23:29
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

cs_Ballesteros Messages postés 11 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 27 novembre 2010
24 nov. 2010 à 23:22
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 ?
0
cs_Ballesteros Messages postés 11 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 27 novembre 2010
24 nov. 2010 à 23:29
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.
0
Rejoignez-nous