Donc, rédigeons sdlopengl_app.h :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#ifndef SDLOPENGL_APP_H
#define SDLOPENGL_APP_H
#include <time.h>
#include <SDL.h>
#include <SDL_image.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include "vecteur.h"
#include "sdlglutils.h"
#include "camera.h"
#include <map>
|
Ensuite, nous gardons notre système de map pour les touches :
1
2
|
typedef std::map<SDLKey,bool> KeyStates;
typedef std::map<std::string,SDLKey> KeyConf;
|
Les fonctions publiques
Déclaration de la classe, constructeur et destructeur :
1
2
3
4
|
class SDLOpenGl_app{
public:
SDLOpenGl_app(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
virtual ~SDLOpenGl_app();
|
La fonction principale :
La fonction qui renvoie la taille de la fenêtre :
Les fonctions qui initialiseront la caméra de l'application :
1
2
|
void setCamera(const Camera & cam);
void setCamera(const Vecteur & pos, double theta = 0, double phi = 0, double rouli = M_PI/2);
|
Si on a besoin de faire bouger la caméra :
1
|
void moveCamera(const Vecteur & dv);
|
On s'occupe du changement de rotation et de l'initialisation de la rotation de la Camera :
1
2
|
void rotationCamera(double dteta, double dPhi, double dRouli);
void setRotationCamera(double theta, double phi, double rouli);
|
Si on a besoin de changer la perspective :
1
2
|
void setPerspective( double angle, double width, double height, double near, double far);
void setPerspective( double angle, double aspect, double near, double far);
|
Répétition des touches (pour ne pas être obligé de connaître la fonction de SDL) :
1
|
void keyRepeat(int delay, int interval);
|
Les seteurs habituels :
1
2
3
4
5
|
void setSize(int width, int height);
void setIcon(SDL_Surface* icon);
void setIcon(const std::string & nom_icon);
void setTitre(const std::string & titre);
void setAll(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
|
si on veut définir une position maximale dans l'espace :
1
|
void setPosMax(const Vecteur & posMax);
|
Les fonctions protégées
Les fonctions virtuelles :
1
2
3
|
virtual void draw() =0;
virtual void update(float dt) =0;
virtual void getSDL_Event(SDL_Event & event);
|
Oui, si on veut récupérer un SDL_Event, (on aurait pu le faire dans l'autre classe).
La gestion des touches :
1
2
|
void addKeyEvent(const std::string & action, SDLKey key, bool initValue);
bool keyEventMade(const std::string & action);
|
Fonction d'arrêt de la classe :
La Camera de l'application :
On met la Camera de l'application protected comme ça on aura pas besoin de fonction pour y accéder depuis la classe fille.
Les fonctions privées
Fonction qui récupère les évènements :
1
|
void getEvent(SDL_Event* event);
|
L'initialisation :
1
|
void initSDLOpenGl(double width, double height, double near, double far, double angle, const std::string & titre, const std::string & icon);
|
Et maintenant toutes les variables :
1
2
3
4
5
6
7
8
9
10
11
|
Uint32 p_timeForOneFrame;
Uint32 p_ellapsed_time; Uint32 p_start_time; KeyStates p_keystates; KeyConf p_keyconf; bool p_isRun; Vecteur p_fenetre; Vecteur p_posMax; };
#endif
|
Vous avez sûrement remarqué, il n'y a pas de constructeur de copie ni d'opérateur =, bien sur vous pouvez les rajouter mais si vous vous rappelez pourquoi il ne faut pas copier cette classe c'est mieux.
Encore un résumé :
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#ifndef SDLOPENGL_APP_H
#define SDLOPENGL_APP_H
#include <time.h>
#include <SDL.h>
#include <SDL_image.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include "vecteur.h"
#include "sdlglutils.h"
#include "camera.h"
#include <map>
typedef std::map< SDLKey,bool> KeyStates; typedef std::map<std::string,SDLKey> KeyConf;
/**
@brief Classe qui a pour but de créer une application SDL avec un affichage OpenGl sans avoir besoin de se trimbaler toute l'initialisation à chaque fois
*/
class SDLOpenGl_app{
public:
SDLOpenGl_app(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
virtual ~SDLOpenGl_app();
void executer();
Vecteur getFenetre();
void setCamera(const Camera & cam);
void setCamera(const Vecteur & pos, double theta = 0, double phi = 0, double rouli = M_PI/2);
void moveCamera(const Vecteur & dv);
void rotationCamera(double dteta, double dPhi, double dRouli);
void setRotationCamera(double theta, double phi, double rouli);
void setPerspective( double angle, double width, double height, double near, double far);
void setPerspective( double angle, double aspect, double near, double far);
void keyRepeat(int delay, int interval); void setSize(int width, int height);
void setIcon(SDL_Surface* icon);
void setIcon(const std::string & nom_icon);
void setTitre(const std::string & titre);
void setAll(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
void setPosMax(const Vecteur & posMax);
void setFPS(unsigned int fps);
protected:
///fonction virtuelle d'affichage
virtual void draw() =0;
///fonction virtuelle de calcul
/** @param dt : intervalle de temps (très petit) utile pour effectuer des calculs de vitesses ou l'accélération
*/
virtual void update(float dt) =0;
virtual void getSDL_Event(SDL_Event & event);
void addKeyEvent(const std::string & action, SDLKey key, bool initValue);
bool keyEventMade(const std::string & action);
void stop();
///@a Camera de l'application
Camera camera;
private:
void getEvent(SDL_Event* event);
void initSDLOpenGl(double width, double height, double near, double far, double angle, const std::string & titre, const std::string & icon);
Uint32 p_timeForOneFrame;
///intervalle de temps entre le temps courrant et la dernière mesure de temps de l'application
Uint32 p_ellapsed_time; ///instant ou l'appilcation a été déclenchée
Uint32 p_start_time; ///tableau de bool pour les entrées clavier
KeyStates p_keystates; ///association actions touches
KeyConf p_keyconf; ///booléen qui dit si l'application est en train d'être exécute
bool p_isRun; ///taille de la fenêtre
Vecteur p_fenetre; ///position maximale d'un objet dans l'application
Vecteur p_posMax; };
#endif // SDLOPENGL_APP_H
|
Ça fait déjà plusieurs fois que je vois ça, qu'est-ce que c'est que les commentaires bizarre genre "///" ou "/** ...*/", et "@param ..." ?
C'est une manière d'écrire les commentaires qui permet de générer de la documentation du son projet (je vous en parlerai dans le chapitre sur Doxygen, mais j'empiète un peu)
|