00001 00002 #ifndef _GK_APP_H 00003 #define _GK_APP_H 00004 00005 #include "SDLPlatform.h" 00006 00007 namespace gk { 00008 00009 //! application de base SDL + openGL. consultez le <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/index.html">libSDL Programming Guide</a> 00010 class App 00011 { 00012 protected: 00013 unsigned char *m_key_state; 00014 unsigned int *m_key_map; 00015 00016 int m_width, m_height; 00017 int m_stop; 00018 00019 App( const App& ); 00020 App& operator=( const App& ); 00021 00022 public: 00023 //! \name initialisation manuelle de l'application. 00024 // @{ 00025 //! construction d'une application par defaut (non initialisee). 00026 App( ); 00027 00028 //! cree une fenetre de dimension w x h et termine l'initialisation. 00029 int createWindow( const int w, const int h ); 00030 00031 //! \name initialisation complete de l'application. 00032 // @{ 00033 //! construction d'une application. 00034 //! \param w largeur de la fenetre 00035 //! \param h largeur de la fenetre 00036 App( const int w, const int h ); 00037 // @} 00038 00039 //! destruction de l'application. 00040 virtual ~App( ); 00041 00042 //! redimensionne la fenetre. 00043 int resizeWindow( const int w, const int h, const unsigned int flags= 0 ); 00044 00045 //! renvoie les dimensions de la fenetre 00046 int windowWidth( ) const 00047 { 00048 return m_width; 00049 } 00050 00051 //! renvoie les dimensions de la fenetre 00052 int windowHeight( ) const 00053 { 00054 return m_height; 00055 } 00056 00057 00058 //! indique si la fenetre est fermee. 00059 bool isClosed( ); 00060 00061 //! demander a fermer la fenetre. 00062 void Close( ); 00063 00064 //! traitement des evenements systemes : clavier, souris, fenetre, etc. 00065 bool processEvents( ); 00066 00067 //! \name interception des evenements clavier / souris / redimensionnement. 00068 //! App fournit une implementation par defaut qui ne fait rien 00069 //! (les evenements sont reellement traites par processEvents()). 00070 //! a deriver, pour integrer nvWidgets, par exemple. 00071 00072 // @{ 00073 //! traitement des redimensionnements de la fenetre de l'application. 00074 virtual void processWindowResize( SDL_ResizeEvent& event ) 00075 { 00076 return; 00077 } 00078 00079 //! traitement des clicks souris. 00080 virtual void processMouseButtonEvent( SDL_MouseButtonEvent& event ) 00081 { 00082 return; 00083 } 00084 00085 //! traitement des deplacements de la souris. 00086 virtual void processMouseMotionEvent( SDL_MouseMotionEvent& event ) 00087 { 00088 return; 00089 } 00090 00091 //! traitement des evenements claviers. 00092 virtual void processKeyboardEvent( SDL_KeyboardEvent& event ) 00093 { 00094 return; 00095 } 00096 // @} 00097 00098 //! renvoie le tableau d'etat des touches du clavier. 00099 /*! permet de connaitre l'etat d'une touche. 00100 le code ascii ou l'identifiant SDLK_xxx peuvent etre utilises comme indices dans le tableau. \n 00101 la liste des codes est dans <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/sdlkey.html">libSDL Programming Guide</a> 00102 00103 exemple : getKeys()['a'], ou getKeys()[SDLK_UP] 00104 */ 00105 unsigned char *getKeys( ); 00106 00107 //! renvoie l'etat d'une touche selon son code ascii ou son identifiant SDLK_xxx. 00108 //! la liste des codes est dans <a href="http://www710.univ-lyon1.fr/~jciehl/Public/SDL_PG/sdlkey.html">libSDL Programming Guide</a> 00109 /*! exemple : key('a'), ou key(SDLK_UP) 00110 00111 la fonction renvoie une reference, on peut l'utiliser pour desactiver manuellement 00112 une touche lorsque l'action a ete traitee et que l'on ne souhaite pas la re-executer a chaque image. 00113 00114 \code 00115 if(key('a')) { 00116 printf("a\n"); 00117 key('a')= 0; 00118 } 00119 \endcode 00120 */ 00121 unsigned char& key( const int key ); 00122 00123 //! \name encapsulation de la boucle principale 00124 //! deriver de App pour construire une nouvelle application. 00125 00126 // @{ 00127 //! appele apres l'initialisation complete de App et la creation du device. 00128 //! a redefinir en derivant App. 00129 //! doit renvoyer -1 en cas d'echec. 00130 virtual int init( ) { return 0; } 00131 00132 //! demarre la boucle principale. 00133 //! App fournit une version complete, il n'est pas necessaire de la redefinir. 00134 virtual int run( ); 00135 00136 //! appele avant la fermeture de l'application. 00137 //! a redefinir en derivant App. 00138 //! doit renvoyer -1 en cas d'echec. 00139 virtual int quit( ) { return 0; } 00140 00141 //! appele regulierement pour mettre a jour la scene (animations, deplacements, etc.). 00142 //! \param time millisecondes ecoulees depuis le lancement, 00143 //! \param delta millisecondes ecoulees depuis l'appel precedent. 00144 //! a redefinir en derivant App. 00145 //! doit renvoyer 0 pour sortir de la boucle principale, ou 1 pour continuer. 00146 virtual int update( const int time, const int delta ) { return 1; } 00147 00148 //! appele regulierement pour afficher la scene. 00149 //! a redefinir en derivant App. 00150 //! doit renvoyer 0 pour sortir de la boucle principale, ou 1 pour continuer. 00151 virtual int draw( ) { return 1; } 00152 // @} 00153 }; 00154 00155 } 00156 00157 #endif