Meuh! C'est Angle_blond qui me stresse pour un rien, comme ci j'avais fait une grosse erreur. Sinon, après avoir regardé mon morceau de code ... personnellement je n'ai rien à me reprocher. Donc j'attends son retour pour savoir ce qui cloche :p
De plus, ce n'est pas sur un chemin critique ... et je n'ai pas remarqué de baisse de performance (genre une attente de 10 secondes )
Donc, c'est juste par curiosité (et à cause de sa remarque) que je demande ce qui cloche :p
----------
Sinon ... revenons sur mon "avancement",
Nous voici au tout début de la refonte de la base du jeu. Le but est donc de refaire toute l'interface entre le jeu en lui même et la bibliothèque graphique. Plus précisément, je vais faire en sorte que changer de bibliothèque graphique soit plus que simple et surtout que cela ne modifie en rien le code du jeu.
Pour ce faire, je vais crée classe virtuelle pure définissant les fonctions devant être réimplémentées par la classe utilisant la bibliothèque.
La petite particularité que je tiens à rajouter, c'est que la classe doit avoir une visibilité tout aussi importante qu'une bibliothèque externe. Cela veut dire, que malgré un héritage, il n'y aura pas d'instance de la classe. Pour ce faire, j'utilise une classe statique dans laquelle on appelera la classe d'interface (j'aurais aussi pu utilisé un Singleton ...).
Pour indication, j'ai fait un pseudo diagramme UML (voir pièce jointe). Je n'avais pas de logiciel spécialisé, alors j'ai fait le tout avec OpenOffice (je ne sais plus grand chose de l'UML ... donc c'est peut être légèrement faux).
Voici la liste des types que j'utilise actuellement:
Voici la liste des fonctions:SDL_Rect
SDL_Colour
SDL_Surface
SDL_Event
SDL_VideoInfo
Et la liste des macros / définition supplémentaires:SDL_Init()
SDL_Quit()
SDL_ShowCursor()
SDL_WM_SetCaption()
SDL_VideoModeOK()
SDL_GetVideoInfo()
SDL_SetVideoMode()
SDL_PumpEvents()
SDL_GetKeyState()
SDL_SetEventFilter()
SDL_FillRect()
SDL_BlitSurface()
SDL_CreateRGBSurface()
SDL_CreateRGBSurfaceFrom()
SDL_FreeSurface()
SDL_DisplayFormat()
SDL_SetColorKey()
SDL_SetAlpha()
SDL_UpdateRect()
SDL_LockSurface()
SDL_UnlockSurface()
SDL_Delay()
SDL_GetTicks()
IMG_Load
IMG_GetError()
TTF_OpenFont()
TTF_RenderText_Solid()
TTF_GetError()
Pour les types, je redéfini mes types génériques (Colour , Rect, Surface). Lors de l'appel aux fonctions de NEngine, j'utiliserai mes types, et si besoin, ceux ci seront convertis par la couche implémentant la bibliothèque graphique.SDL_QUERY
SDL_ENABLE
SDL_DISABLE
SDL_MUSTLOCK
SDL_LIL_ENDIAN
SDL_BYTEORDER
SDL_QUIT
SDL_DOUBLEBUF
SDL_ANYFORMAT
SDL_HWSURFACE
SDL_FULLSCREEN
SDL_GL_DOUBLEBUFFER
SDL_OPENGL
Je profite d'une petite retouche de mes (mon) types déjà implémentés: Vec2.
Je lui ai défini deux nouveau noms:
Et ses membres peuvent être appelé de deux manières différentes grace à un 'union':
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 typedef Vec2<int> ISize2; typedef Vec2<unsigned int> USize2;
Cela peut, d'après moi, rendre le code plus lisible, lorsque j'utilise le Vec2 pour définir des tailles (par exemple, taille de la fenêtre nouvellement créée)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 union { T x; /*!< The value on the x axis */ T width; }; union { T y; /*!< The value on the y axis */ T height; };
La grande question était: comment faire en sorte que nous ayons un seul type visible dans l'application, mais que celui ci est différent pour chaque bibliothèque. A cause de ce problème (et de la solution que j'ai choisi) on ne va pas pouvoir utiliser deux bibliothèques en même temps.
Voici un exemple de la solution que j'ai pris pour le type de la fenêtre:
Comme ceci, selon la bibliothèque utiliser, le type va être différent. Par contre, l'utilisateur aura accès à ces types, mais ne pourra pas en faire grand chose. Ce sont les fonctions des implémentations des bibliothèques qui auront à utiliser ces types et non l'utilisateur (sinon, ce dernier n'aura pas de code indépendant de la bibliothèque).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 typedef unsigned int Uint32; #ifdef SDL_ENGINE #include <SDL/SDL.h> typedef SDL_Surface* Window; #elif SFML_ENGINE typedef sf::RenderWindow Window; #elif GLUT_ENGINE typedef int Window; // In GLUT, there is no access to the Window. So int is the type (to check error) #endif
(Je continue à être perplexe sur ce code ... )
Maintenant, le code de NE / NEngine / NESDL:
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 class NE { private: static NEngine* pEngine; public: static bool init(void); static void stop(void); static NEngine* get(void); }; NEngine* NE::pEngine = NULL; bool NE::init(void) { if ( NE::pEngine != NULL ) { LError << "The native engine is already defined"; return false; } try { NE::pEngine = new NESDL(); } catch (ConstructionFailedException& cfe) { LError << cfe.what(); return false; } return true; } void NE :: stop(void) { delete NE::pEngine; NE::pEngine = NULL; } NEngine* NE :: get(void) { assert(NE::pEngine); return NE::pEngine; }Pour le code de NESDL, on retrouvera exactement ce qui avait dans mon ancienne classe Window (qui a été enlevé entre temps).
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 class NEngine { private: public: virtual ~NEngine() {} virtual Window createWindow(const USize2& winSize, const unsigned short bpp, const bool isFullscreen, const bool isOpenGL)=0; virtual USize2 getWindowSize(const Window win)=0; virtual int getBitsPerPixel(const Window win)=0; virtual void destroyWindow(Window win)=0; virtual bool isCursorVisible(void)const=0; virtual void setCursorVisible(const bool mustShowCursor)const=0; virtual void setCaption(const std::string& windowName, const std::string& iconName)const=0; virtual bool needWindowClosure(void)const=0; };
J'ai commencé à intégré ce nouveau code dans l'application, et pour le moment, je peux dire que cela va. Même si le design n'est peut être pas si bien que cela.
Demain, j'implémenterai le reste de l'interface.
Partager