jeu.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. #include "jeu.h"
  2. int jeuMulti( SDL_Surface* screen, Config settings )
  3. {
  4. /// [1] Préparation des composants
  5. // [1.1] Composants de base SDL
  6. SDL_Event event;
  7. bool done = false;
  8. Uint32 tempsPrecedent(0), ecart(0), frameRate(1000/12), dernierStart(0);//12fps
  9. // [1.2] Gestionnaires
  10. Collisions collisionneur(screen, settings.xSize, settings.ySize);
  11. TableauPower powerCreater(screen, &collisionneur, settings.nbPouvoirs );
  12. Score tabScore;
  13. clearScore( &tabScore );
  14. // [1.3] Gestion paramètres
  15. int nbJoueurs = settings.nbJoueurs;
  16. if (nbJoueurs < 1)
  17. return 1;
  18. else if (nbJoueurs > 12)
  19. return 1;
  20. // [1.4] Création des images des liners
  21. if (!initialisationPict())
  22. return false;
  23. // [1.5] Création du texm_xl.tRender
  24. TextRender texter( "Polices/", nbJoueurs, settings.ySize );
  25. texter.preLoadName( settings.pseudo[0], ROUGE );
  26. texter.preLoadName( settings.pseudo[1], BLEU );
  27. texter.preLoadName( settings.pseudo[2], VERT );
  28. texter.preLoadName( settings.pseudo[3], JAUNE );
  29. texter.preLoadName( settings.pseudo[4], ROSE );
  30. texter.preLoadName( settings.pseudo[5], CYAN );
  31. texter.preLoadName( settings.pseudo[6], ORANGE );
  32. texter.preLoadName( settings.pseudo[7], VIOLET );
  33. texter.preLoadName( settings.pseudo[8], GRIS );
  34. texter.preLoadName( settings.pseudo[9], MARINE );
  35. texter.preLoadName( settings.pseudo[10], PLUME );
  36. texter.preLoadName( settings.pseudo[11], MARRON );
  37. // [1.6] Création des liners
  38. int nbVivants(0), nbVivantsPrec(4);
  39. int guidon[12], nbPoints[nbJoueurs];
  40. Liner* hyperliner[nbJoueurs];
  41. for (int i(0); i<nbJoueurs; i++){
  42. hyperliner[i] = new Liner(5, 5, DROITE, i, screen, texter.takeName(settings.pseudo[i]), &collisionneur, &powerCreater) ;
  43. guidon[i] = nbPoints[i] = 0;
  44. }
  45. // [1.7] Création du démarreur
  46. Starter myStarter( settings.xSize, settings.ySize );
  47. myStarter.loadAreas();
  48. /// [2] Boucle principale
  49. while (!done)
  50. {
  51. // [2.1] Gestion évènements
  52. while (SDL_PollEvent(&event))
  53. {
  54. switch (event.type)
  55. {
  56. case SDL_QUIT:
  57. done = true;
  58. break;
  59. case SDL_KEYDOWN:
  60. // Controles de joueurs
  61. for ( int i(0); i < nbJoueurs; i ++ )
  62. {
  63. if ( event.key.keysym.sym == settings.cmd[i][0] )
  64. guidon[i] = TOURNE_GAUCHE ;
  65. else if ( event.key.keysym.sym == settings.cmd[i][2] )
  66. guidon[i] = TOURNE_DROITE ;
  67. if ( event.key.keysym.sym == settings.cmd[i][1] && nbVivants > 1 )
  68. hyperliner[i]->utiliserPouvoir();
  69. }
  70. // Commandes classiques
  71. switch (event.key.keysym.sym)
  72. {
  73. case SDLK_ESCAPE:
  74. done = true;
  75. break;
  76. case SDLK_p:
  77. case SDLK_KP_ENTER:
  78. case SDLK_RETURN:
  79. // Pause
  80. dernierStart = SDL_GetTicks();
  81. // Réinitialisation
  82. nbVivants = nbJoueurs;
  83. collisionneur.reinitialiser();
  84. powerCreater.initialiser();
  85. // Placement
  86. myStarter.spawnLiners( hyperliner, nbJoueurs );
  87. break;
  88. /*case SDLK_RIGHT:
  89. guidon[0] = TOURNE_DROITE;
  90. break;
  91. case SDLK_LEFT:
  92. guidon[0] = TOURNE_GAUCHE;
  93. break;
  94. case SDLK_UP:
  95. case SDLK_DOWN:
  96. if ( hyperliner[0] != 0 && nbVivants > 1 )
  97. hyperliner[0]->utiliserPouvoir();
  98. break;
  99. case SDLK_d:
  100. guidon[1] = TOURNE_DROITE;
  101. break;
  102. case SDLK_q:
  103. case SDLK_a:
  104. guidon[1] = TOURNE_GAUCHE;
  105. break;
  106. case SDLK_s:
  107. case SDLK_z:
  108. case SDLK_w:
  109. if ( nbJoueurs > 1 && hyperliner[1] != 0 && nbVivants > 1 )
  110. hyperliner[1]->utiliserPouvoir();
  111. break;
  112. case SDLK_l:
  113. guidon[2] = TOURNE_DROITE;
  114. break;
  115. case SDLK_j:
  116. guidon[2] = TOURNE_GAUCHE;
  117. break;
  118. case SDLK_k:
  119. case SDLK_i:
  120. if ( nbJoueurs > 2 && hyperliner[2] != 0 && nbVivants > 1 )
  121. hyperliner[2]->utiliserPouvoir();
  122. break;
  123. case SDLK_KP6:
  124. guidon[3] = TOURNE_DROITE;
  125. break;
  126. case SDLK_KP4:
  127. guidon[3] = TOURNE_GAUCHE;
  128. break;
  129. case SDLK_KP5:
  130. case SDLK_KP8:
  131. if ( nbJoueurs > 3 && hyperliner[3] != 0 && nbVivants > 1 )
  132. hyperliner[3]->utiliserPouvoir();
  133. break;*/
  134. default:
  135. break;
  136. }
  137. } // end switch event type
  138. } // end of message processing
  139. // [2.2] Calculs
  140. // On compte les survivants
  141. nbVivantsPrec = nbVivants;
  142. nbVivants = 0;
  143. for (int i(0); i<nbJoueurs; i++)
  144. if (hyperliner[i] != 0)
  145. if (hyperliner[i]->estVivant())
  146. nbVivants++;
  147. if ( nbVivants != nbVivantsPrec && nbVivants < 2 )
  148. updateScore( &tabScore, hyperliner, nbJoueurs );
  149. if ( nbVivants != nbVivantsPrec && nbJoueurs > 1 )
  150. powerCreater.bruiterMort();
  151. nbVivants = (nbJoueurs == 1)? 2 : nbVivants;/**< DEBUG : à enlever */
  152. // Si il y en a assez, la partie continue
  153. if (nbVivants > 1)
  154. for (int i(0); i<nbJoueurs; i++){
  155. if (hyperliner[i] != 0 && SDL_GetTicks() - dernierStart > 3000)
  156. {
  157. hyperliner[i]->actualiser(guidon[i]);
  158. hyperliner[i]->direEstFini( false );
  159. }
  160. else if (hyperliner[i] != 0)
  161. hyperliner[i]->direEstFini( true );
  162. guidon[i] = 0;
  163. }
  164. else
  165. {
  166. for (int i(0); i<nbJoueurs; i++)
  167. if (hyperliner[i] != 0)
  168. hyperliner[i]->direEstFini( true );
  169. }
  170. // On gère les collisions en même temps pour plus d'équité
  171. for (int i(0); i<nbJoueurs; i++){
  172. if (hyperliner[i] != 0)
  173. {
  174. hyperliner[i]->collisioner();
  175. }
  176. }
  177. // On nettoie les pouvoirs utilisés
  178. powerCreater.actualiser();
  179. // [2.3] Dessin des composants
  180. SDL_FillRect(screen, 0, 0);
  181. collisionneur.afficher();
  182. powerCreater.afficher();
  183. for (int i(0); i<nbJoueurs; i++)
  184. {
  185. if (hyperliner[i] != 0)
  186. hyperliner[i]->afficher();
  187. }
  188. if ( nbVivants < 2 ) { // Jeu en fini
  189. displayScore( &tabScore, &texter, nbJoueurs, screen, settings.pseudo );
  190. SDL_ShowCursor( SDL_ENABLE );
  191. }
  192. else SDL_ShowCursor( SDL_DISABLE ); // Jeu en cours
  193. SDL_Flip(screen);
  194. // [2.4] Gestion du temps
  195. /*ecart = SDL_GetTicks() - tempsPrecedent;
  196. if (ecart < frameRate)
  197. SDL_Delay(frameRate - ecart);
  198. tempsPrecedent = SDL_GetTicks();*/
  199. ecart = SDL_GetTicks() - tempsPrecedent;
  200. while (ecart < frameRate)
  201. {
  202. if ( frameRate - ecart > 4 )
  203. SDL_Delay( frameRate - ecart - 4 );
  204. ecart = SDL_GetTicks() - tempsPrecedent;
  205. }
  206. tempsPrecedent = SDL_GetTicks();
  207. } //fin bcl principale
  208. /// [3] Etape de fin
  209. // Destruction des composants dynamiques
  210. for (int i(0); i<nbJoueurs; i++)
  211. if (hyperliner[i] != 0)
  212. delete hyperliner[i];
  213. fermeturePict();
  214. return 0;
  215. }
  216. Config readConfig()
  217. {
  218. /// Config
  219. Config settings;
  220. std::string const source("config.txt");
  221. std::ifstream fluxIn(source.c_str());
  222. short optEcran;
  223. /// Attributions
  224. if (fluxIn)
  225. {
  226. //Ouverture fichier succés
  227. fluxIn >> settings.xSize;
  228. fluxIn >> settings.ySize;
  229. fluxIn >> settings.nbJoueurs;
  230. fluxIn >> optEcran;
  231. fluxIn >> settings.nbPouvoirs;
  232. for (int i(0); i<12; i++)
  233. {
  234. fluxIn >> settings.pseudo[i];
  235. fluxIn >> settings.cmd[i][0];
  236. fluxIn >> settings.cmd[i][1];
  237. fluxIn >> settings.cmd[i][2];
  238. }
  239. }
  240. else
  241. {
  242. //Echec ouverture fichier
  243. std::cout << "ERREUR: impossible de lire le fichier " << source << " ." << std::endl;
  244. //Paramètres par défaut
  245. settings.xSize = 45;
  246. settings.ySize = 30;
  247. settings.nbJoueurs = 2;
  248. optEcran = 0;
  249. settings.nbPouvoirs = 5;
  250. for (int i(0); i<4; i++)
  251. settings.pseudo[i] = "Joueur " + intToStr(i);
  252. }
  253. /// Optimisation
  254. if ( optEcran != 2 ) {
  255. settings.pleinEcran = optEcran;
  256. }
  257. else {
  258. settings.pleinEcran = true;
  259. const SDL_VideoInfo* fenetreInfo = SDL_GetVideoInfo();
  260. settings.xSize = fenetreInfo->current_w / 20;
  261. settings.ySize = fenetreInfo->current_h / 20;
  262. }
  263. /// Fin
  264. return settings;
  265. }
  266. void updateScore( Score* tabScore, Liner** hyperliner, int nbJoueurs )
  267. {
  268. if ( hyperliner[0] == 0x0 ) return; // Sécurité
  269. /// Compter les scores
  270. int murder;
  271. for ( Uint16 i(0); i < nbJoueurs; i++) {
  272. murder = hyperliner[i]->getMeurtrier();
  273. if ( murder != -1 ) tabScore->mort[i]++; // Morts
  274. if ( murder != -1 && murder != 5 ) tabScore->frag[murder]++; // Frags
  275. }
  276. }
  277. void displayScore( Score* tabScore, TextRender* texter, int nbJoueurs, SDL_Surface* screen, std::string pseudo[12] )
  278. {
  279. SDL_Rect pos = { 50, 50, 0, 0 }, blanc;
  280. const int espace( (screen->h - 100 ) / nbJoueurs );
  281. std::string chaine;
  282. SDL_Surface* bande;
  283. for ( Uint16 i(0); i < nbJoueurs; i++ ) {
  284. /// Texte
  285. chaine = pseudo[i] + " [" + intToStr(i+1) + "] : " + intToStr(tabScore->frag[i]) + " frags; " + intToStr(tabScore->mort[i]) + " morts.";
  286. /// Text rendering
  287. bande = texter->tRendLite( i, chaine );
  288. /// Blanco
  289. blanc.x = pos.x - 4;
  290. blanc.y = pos.y - 2;
  291. blanc.h = bande->h + 4;
  292. blanc.w = bande->w + 8;
  293. SDL_FillRect( screen, &blanc, 0xffffff );
  294. /// Application bande
  295. SDL_BlitSurface( texter->takeLite(i), 0, screen, &pos );
  296. pos.y += espace;
  297. }
  298. }
  299. void clearScore ( Score* tabScore )
  300. {
  301. for ( Uint16 i(0); i < 12; i++) {
  302. tabScore->mort[i] = tabScore->frag[i] = 0; // Initialisaton
  303. }
  304. }