Souci avec la bibliothèque SDL...

Résolu/Fermé
Oguona Messages postés 19 Date d'inscription samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012 - 27 déc. 2012 à 16:33
Oguona Messages postés 19 Date d'inscription samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012 - 28 déc. 2012 à 15:28
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 1270 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
27 déc. 2012 à 23:50
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 samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012
28 déc. 2012 à 10:52
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 1270 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
28 déc. 2012 à 13:13
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 samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012
28 déc. 2012 à 14:46
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 samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012
Modifié par Oguona le 28/12/2012 à 15:02
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 1270 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
Modifié par armasousou le 28/12/2012 à 15:29
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 samedi 15 septembre 2012 Statut Membre Dernière intervention 28 décembre 2012
28 déc. 2012 à 15:28
=) Evidemment... Merci ^^ Je devais être fatigué. Problème résolu !
0