SDL_Init et SDL_InitSubSystem
Bonjour à tous,
initialiser la SDL se fait normalement avec SDL_Init et des flags qui indiquent quelles parties activer
[mode bourrin ON]
j'ai essayé un SDL_Init(0) avec succès
suivi d'un SDL_InitSubSystem(SDL_INIT_VIDEO) avec succès également
j'ai supprimé le SDL_Init(0) sans que cela pose problème
[mode bourrin OFF]
je me demandais si ce principe était convenable et ne risquait pas de poser des problèmes sur d'autres systèmes (je suis sous windows)
en fait, je cherche à mettre la gestion de l'affichage (création de la fenêtre, changement de résolution, passe en fullscreen...) dans un singleton
le constructeur du singleton fait appel à SDL_InitSubSystem(SDL_INIT_VIDEO) et son destructeur fait appel à SDL_QuitSubSystem(SDL_INIT_VIDEO)
visiblement ça ne pose pas de problème à la SDL
dites moi ce que vous en pensez
ps: je précise qu'un appel à SDL_Quit est effectué lorsque le programme se termine, à voir également s'il est nécessaire ou inutile, pour l'instant j'ai préféré le laisser
ci joint, une partie du code du singleton CDisplay :
Code:
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
| #include "Display.h"
#include "sdl/sdl.h"
// static declaration of display manager's unique instance
CDisplay* CDisplay::m_pInstance = NULL;
// constructor & virtual destructor
CDisplay::CDisplay(void)
{
// initialisation SDL video
if ( SDL_InitSubSystem( SDL_INIT_VIDEO ) < 0 )
{
printf( "Echec SDL_Init : %s\n", SDL_GetError() );
return; // throw exception
}
// display parameters
m_sTemp.nScreenX = DISPLAY_SCREENX_DEFAULT;
m_sTemp.nScreenY = DISPLAY_SCREENY_DEFAULT;
m_sTemp.nScreenBpp = DISPLAY_SCREENBPP_DEFAULT;
// fullscreen flag
m_sTemp.bFullscreen = DISPLAY_FULLSCREEN_DEFAULT;
// OpenGL parameters
m_sTemp.nZBits = DISPLAY_ZBUFFER_DEFAULT;
m_sTemp.nStencilBits = DISPLAY_STENCIL_DEFAULT;
// mise à jour de l'affichage
Update(m_sTemp);
}
CDisplay::~CDisplay(void)
{
SDL_QuitSubSystem( SDL_INIT_VIDEO );
}
// static method to retrieve unique instance of manager
CDisplay* CDisplay::Initialize(void)
{
if(!m_pInstance)
m_pInstance = new CDisplay;
return m_pInstance;
}
void CDisplay::ShutDown(void)
{
delete m_pInstance;
m_pInstance = NULL;
} |