main.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include <iostream>
  2. #include <SDL/SDL.h>
  3. #undef main
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include "Niveau.h"
  7. #include "Thread.h"
  8. #include "Flux/Client.h"
  9. #include "Flux/LecteurSSD.h"
  10. #include "Flux/SpriteLoader.h"
  11. class Patienter : public Thread
  12. {
  13. public:
  14. Patienter(Client* lan, int* manage, char* IDMoi, char* IDLui): m_lan(lan), m_manage(manage), m_IDMoi(IDMoi), m_IDLui(IDLui)
  15. {
  16. }
  17. void run()
  18. {
  19. if (m_lan != 0) {
  20. if (!m_lan->rendreUtilisable()) {
  21. std::cout << "Problème d'initialisation des connexions." << std::endl;
  22. *m_manage = -1;
  23. return;
  24. }
  25. }
  26. else {
  27. std::cout << "Problème de lecture de la configuration réseau." << std::endl;
  28. *m_manage = -1;
  29. return;
  30. }
  31. m_lan->recevoir(m_IDMoi, 1);
  32. std::cout << "Votre identifiant est : " << *m_IDMoi << std::endl;
  33. if (*m_IDMoi == '0') *m_IDLui = '1';
  34. else *m_IDLui = '0';
  35. *m_manage = 1;
  36. }
  37. private:
  38. Client* m_lan;
  39. int *m_manage;
  40. char *m_IDMoi, *m_IDLui;
  41. };
  42. int main ( int argc, char** argv )
  43. {
  44. srand(time(0));
  45. /// [1] Démarrage
  46. // [1.1] Démarrages SDL
  47. if ( SDL_Init( SDL_INIT_VIDEO ) < 0)
  48. {
  49. std::cout << "Impossible d'initialiser la SDL: " << SDL_GetError() << std::endl;
  50. return 1;
  51. }
  52. putenv("SDL_VIDEO_CENTERED=1");
  53. // [1.2] Préparation de fermeture
  54. atexit(SDL_Quit);
  55. // [1.3] Para-fenêtre
  56. SDL_WM_SetCaption("Twokoban", 0);
  57. /// [2] Préparation des composants
  58. // [2.0] Variables
  59. const char crash(197);//'┼'
  60. const char loadLvl(9);//'○'
  61. const char pasBouger(254);//'■'
  62. const char fini(36);//'$'
  63. const char reset(47);//'/'
  64. char cmd(pasBouger), cmdLui(pasBouger);
  65. // [2.1] Préparation du réseau
  66. // [2.1.1] Fenetre d'attente
  67. SDL_Surface* attente = SDL_SetVideoMode(400, 400, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
  68. if ( !attente )
  69. {
  70. std::cout << "Inpossible de créer une fenêtre : " << SDL_GetError() << std::endl;
  71. return 1;
  72. }
  73. SDL_Surface* imgattente = SDL_LoadBMP("Textures/patientez.bmp");
  74. SDL_BlitSurface(imgattente, 0, attente, 0);
  75. SDL_Flip(attente);
  76. SDL_FreeSurface(imgattente);
  77. // [2.1.2] initialisation du réseau
  78. char octet;
  79. int manage = 0;
  80. Client* lan(0);
  81. lan = readConfig();
  82. char IDMoi, IDLui;
  83. Patienter *p = new Patienter(lan, &manage, &IDMoi, &IDLui);
  84. p->setAutoDelete(true);
  85. p->start();
  86. SDL_Event event;
  87. while(!manage)
  88. {
  89. // [3.1] Gestion évènements
  90. while (SDL_PollEvent(&event) && !manage)
  91. {
  92. switch (event.type)
  93. {
  94. case SDL_QUIT:
  95. manage = -1;
  96. break;
  97. case SDL_KEYDOWN:
  98. switch (event.key.keysym.sym)
  99. {
  100. case SDLK_ESCAPE:
  101. manage = -1;
  102. default:
  103. break;
  104. }
  105. break;
  106. } // end switch event type
  107. } // end of message processing
  108. }
  109. // [2.1.3] disparition fenetre attente
  110. SDL_FreeSurface(attente);
  111. if(manage == -1)
  112. return -1;
  113. // [2.2] Préparation de la fenêtre
  114. SDL_Surface* screen = SDL_SetVideoMode(40*24, 40*18, 32,
  115. SDL_HWSURFACE|SDL_DOUBLEBUF);
  116. if ( !screen )
  117. {
  118. std::cout << "Inpossible de créer une fenêtre : " << SDL_GetError() << std::endl;
  119. return 1;
  120. }
  121. // [2.3] Préparation du gestionnaire de textures
  122. SpriteLoader* spriteGet(0);
  123. spriteGet = new SpriteLoader("Textures/");
  124. // [2.4] Préparation du niveau
  125. Niveau level(spriteGet);
  126. /// [3] Boucle principale
  127. bool done = false;
  128. while (!done)
  129. {
  130. // [3.1] Gestion évènements
  131. while (SDL_PollEvent(&event) && !done)
  132. {
  133. switch (event.type)
  134. {
  135. case SDL_QUIT:
  136. done = true;
  137. cmd = crash;
  138. break;
  139. case SDL_KEYDOWN:
  140. switch (event.key.keysym.sym)
  141. {
  142. case SDLK_ESCAPE:
  143. done = true;
  144. cmd = crash;
  145. break;
  146. case SDLK_UP:
  147. cmd = 24;
  148. break;
  149. case SDLK_DOWN:
  150. cmd = 25;
  151. break;
  152. case SDLK_RIGHT:
  153. cmd = 26;
  154. break;
  155. case SDLK_LEFT:
  156. cmd = 27;
  157. break;
  158. case SDLK_KP_DIVIDE:
  159. cmd = reset;
  160. break;
  161. default:
  162. break;
  163. }
  164. break;
  165. } // end switch event type
  166. } // end of message processing
  167. // [3.2] Réseau
  168. lan->recevoir(&octet, 1);
  169. switch (octet) // Exécution de la commande requise par le serveur
  170. {
  171. case loadLvl: // Recevoir le niveau
  172. char lvlTmp[18][24];
  173. for (Uint16 y(0); y < 18; y++)
  174. for (Uint16 x(0); x < 24; x++) {
  175. lan->recevoir(&octet, 1);
  176. lvlTmp[y][x] = octet;
  177. }
  178. level.majLevel(lvlTmp);
  179. std::cout << "Niveau reçu." << std::endl;
  180. break;
  181. case crash:
  182. std::cout << "Le serveur a annoncé une erreur critique. Extinction préventive du programme." << std::endl;
  183. done = true;
  184. break;
  185. default:
  186. cmdLui = octet;
  187. break;
  188. }
  189. if ( level.suisJeArrive(IDMoi) )
  190. {
  191. char fin = fini;
  192. lan->envoyer(&fin, 1);
  193. }
  194. else
  195. {
  196. ///*****si crash, latence pour permetre un transfert fonctionnel***********
  197. if(cmd==crash)
  198. SDL_Delay(500);
  199. ///************************************************************************
  200. lan->envoyer(&cmd, 1);
  201. }
  202. // [3.3] Calculs
  203. if(!level.deplacer(IDMoi, cmd))
  204. {
  205. lan->recevoir(&octet, 1);
  206. cmd = reset;
  207. lan->envoyer(&cmd, 1);
  208. }
  209. cmd = pasBouger;
  210. level.deplacer(IDLui, cmdLui);
  211. cmdLui = pasBouger;
  212. level.updateBoutons();
  213. // [3.4] Dessin des composants
  214. level.afficher(screen);
  215. SDL_Flip(screen);
  216. } //fin bcl principale
  217. ///[4] Destruction des composants
  218. SDL_FreeSurface(screen);
  219. delete lan;
  220. delete spriteGet;
  221. std::cout << "Aucune erreur détectée." << std::endl;
  222. return 0;
  223. }