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é.