Souci avec la bibliothèque SDL...

Résolu
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'essaye de me mettre à la bibliothèque SDL mais je n'ai encore pas réussi à faire un seul affichage correct !

J'ai beau chercher dans tout les coins, je ne vois pas pourquoi ce code, une fois exécuté me renvoie l'erreur "Segmentation fault". A s'en arracher les cheveux.

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

void pause()
{
    int continuer = 1;
    SDL_Event event;
 
    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
        }
    }
}

int main(){
	
	//On déclare les deux surfaces
	SDL_Surface *ecran = NULL;
	SDL_Surface *plateau = NULL;
	
	//On donne les deux couleurs utiles
        Uint8 Couleur1 = SDL_MapRGB(ecran->format, 0, 0, 0);
        Uint8 Couleur2 = SDL_MapRGB(ecran->format, 255, 255, 255);
    
        //printf("%d\n%d\n", Couleur1, Couleur2);
        printf("Les couleurs ne sont même pas initialisées\n");
    
	SDL_Init(SDL_INIT_VIDEO);
	
	//On définit la fenêtre et on initialise les surfaces
	ecran = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
	plateau = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 8, 0, 0, 0, 0);
	SDL_WM_SetCaption("Cherchez le nombre", NULL);
	
	//On colore les deux surfaces
	SDL_FillRect(ecran, NULL, Couleur1);
	SDL_FillRect(plateau, NULL, Couleur2);
	
	//On définit la position du rectangle "plateau"
	SDL_Rect position;
	position.x = 0;
	position.y = 0;
	
	//On colle plateau sur ecran
	SDL_BlitSurface(plateau, NULL, ecran, &position);
	
	//On actualise
	SDL_Flip(ecran);
	
	//On met en pause jusqu'à la fermeture de la fenêtre
	pause();
	SDL_Quit();
	return 0;
}


Le pire, est que ça passe si on utilise pas "SDL_MapRGB" mais la surface "plateau" sera noire quoi qu'il arrive...

J'aimerais une surface "plateau" blanche qui s'affiche sur un fond noir. Et je n'ai toujours pas réussi alors que ça parait être la base tout de même. Bref, Au-secour.

3 réponses

armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Déjà définie tes variables au debut de la fonction, ça sera plus propre :)
Il te manque un sdlfreesurface à la fin pour le plateau.

Les couleurs sont des Uint32, mais tu peux mettre int tout simplement.
0
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai donc un peu arrangé mon main(), je n'utilise plus de variables pour les couleurs et toutes les déclarations se font au début, mais la surface "Plateau" reste toujours noire et non blanche comme elle devrait être :

int main(){

	//On déclare les deux surfaces
	SDL_Surface *ecran = NULL;
	SDL_Surface *plateau = NULL;
	
	//On définit la position du rectangle "plateau"
	SDL_Rect position;
	position.x = 220;
	position.y = 180;
	
        SDL_Init(SDL_INIT_VIDEO);
    
	//On définit la fenêtre et on initialise les surfaces
	ecran = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
	plateau = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 8, 0, 0, 0, 0);
	SDL_WM_SetCaption("Cherchez le nombre", NULL);
	
	//On donne les deux couleurs utiles
        //Uint8 Couleur1 = SDL_MapRGB(ecran->format, 0, 0, 0);
        //Uint8 Couleur2 = SDL_MapRGB(ecran->format, 255, 255, 255);
    
        //printf("%d\n%d\n", Couleur1, Couleur2);
	
	//On colore les deux surfaces
	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
	SDL_FillRect(plateau, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
	
	//On colle plateau sur ecran
	SDL_BlitSurface(plateau, NULL, ecran, &position);
	
	//On actualise
	SDL_Flip(ecran);
	
	//On met en pause jusqu'à la fermeture de la fenêtre
	pause();
	SDL_FreeSurface(plateau);
	SDL_Quit();
	return 0;
}
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
plateau = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 8, 0, 0, 0, 0);

Pas 8 mais 32 !!!!!!!!
0
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Même si je fais le SetVideo à 8bit? Tout ne dois pas être en 8bit si je commençe avec ce format?

SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
0
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Je viens de tester, ça fonctionne avec le 32bit. Mais pourquoi pas avec le 8bit? (Sans forcement d'utilité particulière, mais je ne comprends pas pourquoi ça ne fonctionne pas...)
0
armasousou Messages postés 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Tu code tes couleurs de 0/0/0 à 255/255/255 c'est un format 32bit, si tu veux le faire sur 8, faut aller de 0/0/0 à x/x/x (cherche sur le net ^^). Sachant qu'un uint8 fait la même taille qu'un char donc, 1 octet, soit maximum 256 couleurs.

Sachant qu'en 32 tu as 4 milliards de couleurs
0
Oguona Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
=) Evidemment... Merci ^^ Je devais être fatigué. Problème résolu !
0