IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Début de moteur 2D avec SDL: Segfault


Sujet :

SDL

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut Début de moteur 2D avec SDL: Segfault
    Bonjour !

    Je suis en train de faire un petit moteur 2D (qui est une bête surcouche de SDL, qui est sensée camoufler le code SDL).

    Le code SDL (création de la fenêtre) est encapsulé dans une classe nommée SDLGRAPHICS. C'est un singleton pour que l'utilisation soit plus pratique.

    L'attribut m_Screen est déclarée en privée dans la classe.

    Le problème étant un segfault qui survient lors de la création de la fenêtre, c'est en rapport avec le pointeur SDL_Surface *m_Screen.

    Lorsque, dans la fonction BuildWindow(), je fais la fenêtre comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *screen = SDL_SetVideoMode(...);
    Aucun segfault.

    Si j'alloue de la mémoire à m_Screen puis je fais la fenêtre, j'obtiens un Segfault me disant que m_Screen n'a pas de mémoire allouée (emplacement dans la mémoire: 0x00000000).

    SDLGRAPHICS.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #if !defined(_SDLGRAPHICS_H)
    #define _SDLGRAPHICS_H
     
    #include <iostream>
    #include <SDL/SDL.h>
    #include <SDL/SDL_TTF.h>
    #include <SDL/SDL_Image.h>
     
    class SDLGRAPHICS
    {
    private:
    //-------------------------------------------------------------------------
    //--Singleton--------------------------------------------------------------
    //-------------------------------------------------------------------------
    	SDLGRAPHICS() { }
    	~SDLGRAPHICS() { }
     
    	static SDLGRAPHICS *Moteur;
    //-------------------------------------------------------------------------
     
    	SDL_Surface* m_Screen;
     
    public:
    //-------------------------------------------------------------------------
    //--Singleton--------------------------------------------------------------
    //-------------------------------------------------------------------------
    	static SDLGRAPHICS *GetInstance()
    	{
    		if (Moteur == NULL)
    		{
    			Moteur = new SDLGRAPHICS;
    		}
     
    		else
    		{
    			return NULL;
    		}
     
    		return Moteur;
    	}
     
    	static void KillInstance()
    	{
    		if (Moteur != NULL)
    		{
    			delete Moteur;
    			Moteur = NULL;
    		}
    	}
    //-------------------------------------------------------------------------
     
    	void BuildWindow(std::string caption, int width, int height, int bpp);
     
    	void ApplySurface(int x, int y, SDL_Surface* source, SDL_Surface* destination,
    		SDL_Rect* clip = NULL);
     
    	SDL_Surface* LoadSurface(std::string filename);
    };
     
    #endif  //_SDLGRAPHICS_H
    SDLGRAPHICS.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include "SDLGRAPHICS.h"
     
    SDL_Surface* SDLGRAPHICS::LoadSurface(std::string filename)
    {
    	SDL_Surface *image = NULL, *optimized_image = NULL;
     
    	image = IMG_Load(filename.c_str());
     
    	if (image != NULL)
    	{
    		optimized_image = SDL_DisplayFormat(image);
     
    		SDL_FreeSurface(image);
     
    		if (optimized_image != NULL)
    		{
    			// On utilise le mangenta comme couleur a enlever (r:255;g:0;b:255)
    			Uint32 colorkey = SDL_MapRGB(optimized_image->format, 0, 255, 255);
     
    			SDL_SetColorKey(optimized_image, SDL_RLEACCEL | SDL_SRCCOLORKEY, 
    				colorkey);
    		}
    	}
     
    #ifdef __DEBUG__
    	else
    	{
    		string debug_str = "Erreur lors du chargement de l'image '";
     
    		debug_str += filename;
    		debug_str += "'\n";
     
    		OutputDebugString(debug_str.c_str());
    	}
    #endif
     
    	return optimized_image;
    }
     
    void SDLGRAPHICS::ApplySurface(int x, int y, SDL_Surface* source, SDL_Surface* destination,
    				   SDL_Rect* clip)
    {
    	SDL_Rect offset; 
     
    	offset.x = x; offset.y = y; 
     
    	SDL_BlitSurface(source, clip, destination, &offset);
    }
     
    void SDLGRAPHICS::BuildWindow(std::string caption, int width, int height, int bpp)
    {
    	SDL_Init(SDL_INIT_VIDEO);
     
    	m_Screen = SDL_SetVideoMode(width, height, bpp, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
    	SDL_WM_SetCaption(caption.c_str(), NULL);
    }
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include "SDLGRAPHICS.h"
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_TTF.h>
    #include <SDL/SDL_Image.h>
     
    SDLGRAPHICS* SDLGRAPHICS::Moteur = NULL;
     
    int main (int argc, char **argv)
    {
    	SDLGRAPHICS *inst_mot = SDLGRAPHICS::GetInstance();
     
    	inst_mot->BuildWindow("BadMoon Alpha 0.1", 640, 480, 32);
     
    	return 0;
    }
    Merci pour vos réponses. J'ai beaucoup cherché, mais rien trouvé.

  2. #2
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Salut !

    Juste une question : pourquoi allouer de la mémoire vu que SetVideoMode le fait déjà ???

    De plus quelques petites erreurs sont dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (Moteur != NULL)
    		{
    			Moteur = new SDLGRAPHICS;
    		}
     
    		else
    		{
    			return NULL;
    		}
    ça va poser quelques problèmes.
    Peut-être que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (!Moteur)
        Moteur = new SDLGRAPHICS;
    return Moteur;
    marchera mieux.

    Enfin pourquoi mettre un paramètre caption alors que tu ne l'utilises pas ?

    Bon coding !

    @+

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Octobre 2005
    Messages : 141
    Par défaut
    A force de bidouiller quand on connait pas la réponse, ça peut donner du n'importe quoi.

    Bah justement, normalement SetVideoMode alloue de la mémoire, mais ça le fait pas...

    C'était pour tester si ça changeait quelque chose ou pas.

    Pour le caption, c'était encore pour voir si ça changeait quelque chose au problème.

    Pour le singleton, il y a une erreur, effectivement. Merci.

    Par contre, il y a toujours ce segfault. :/

    ----

    EDIT: Le code n'ayant pas changé, j'ai compilé aujourd'hui. Et ça marche. :/

  4. #4
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Tant mieux !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Projet jeu RPG/moteur 3D isométrique avec SDL
    Par Milan111 dans le forum Projets
    Réponses: 4
    Dernier message: 13/04/2006, 22h01
  2. Problème d'affichage d'un sprite avec SDL
    Par youp_db dans le forum SDL
    Réponses: 1
    Dernier message: 11/02/2006, 18h08
  3. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10
  4. [debutant]opengl avec sdl sous visual c++
    Par bourinator dans le forum OpenGL
    Réponses: 1
    Dernier message: 13/06/2005, 11h24
  5. Zone de texte avec SDL
    Par bobtux dans le forum OpenGL
    Réponses: 2
    Dernier message: 08/03/2005, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo