Level.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "Level.h"
  2. Level::Level(std::string nom, int numero, int tableau[NB_BLOC_VERTI][NB_BLOC_HORIZON])
  3. :m_nom(nom),m_numero(numero),m_reussi(false)
  4. {
  5. // [1] Remplissage du tableau
  6. std::cout <<"Le niveau '"<<nom<<"' numero "<<numero<<" fait "<<
  7. NB_BLOC_HORIZON<<" par "<<NB_BLOC_VERTI<<" blocs."<<std::endl<<std::endl;
  8. for (int i(0); i<NB_BLOC_HORIZON; i++)
  9. {
  10. for (int j(0); j<NB_BLOC_VERTI; j++)
  11. {
  12. m_tableau[j][i]=tableau[j][i];
  13. }
  14. }
  15. // [2] Création des surfaces
  16. m_bloc[0] = SDL_CreateRGBSurface(SDL_HWSURFACE, LG_BLOC, LG_BLOC, 16, 0, 0, 0, 0);
  17. m_bloc[1] = SDL_CreateRGBSurface(SDL_HWSURFACE, LG_BLOC, LG_BLOC, 16, 0, 0, 0, 0);
  18. m_bloc[2] = SDL_CreateRGBSurface(SDL_HWSURFACE, LG_BLOC, LG_BLOC, 16, 0, 0, 0, 0);
  19. // [3] Création du titre
  20. std::string nomNiveau("Level N ");
  21. nomNiveau += convertirEntierEnCaracteres(numero);
  22. nomNiveau = nomNiveau + " : " + nom;
  23. std::cout << nomNiveau <<" chargé !" << std::endl;
  24. // [4] Remplissage des surfaces
  25. SDL_FillRect(m_bloc[0],NULL,SDL_MapRGB(m_bloc[0]->format,255,255,255));
  26. SDL_FillRect(m_bloc[1],NULL,SDL_MapRGB(m_bloc[1]->format,255,0,0));
  27. SDL_FillRect(m_bloc[2],NULL,SDL_MapRGB(m_bloc[2]->format,0,128,0));
  28. m_titre = transform(nomNiveau);
  29. // [5] Création de l'arrivéeet du spawn
  30. m_posBut.x=m_posBut.y=-1000;
  31. m_but = createCircle(LG_BLOC/2,SDL_MapRGB(m_bloc[0]->format,0,255,0),5);//m_bloc[0] juste pour récuperer le format 16 bits
  32. m_posSpawn.x=m_posSpawn.y=-1000;
  33. m_spawn = createCircle(LG_BLOC/2,SDL_MapRGB(m_bloc[0]->format,0,255,255),7);
  34. }///Constructeur
  35. Level::~Level()
  36. {
  37. for (int i(0); i<NB_BLOCS; i++)
  38. {
  39. SDL_FreeSurface(m_bloc[i]);
  40. }
  41. SDL_FreeSurface(m_titre);
  42. SDL_FreeSurface(m_but);
  43. SDL_FreeSurface(m_spawn);
  44. }///Destructeur
  45. void Level::setBloc(int x, int y, int typeBloc)
  46. {
  47. if ((typeBloc == RIEN || typeBloc == BLOC || typeBloc == BUMPER || typeBloc == PLANCHE) &&
  48. 0<=x && 0<=y && x<NB_BLOC_HORIZON && y<NB_BLOC_VERTI)
  49. m_tableau[y][x]=typeBloc;
  50. }///setBloc
  51. void Level::save(int xSpawn, int ySpawn, int xBut, int yBut)
  52. {
  53. //à implémenter
  54. }///save
  55. int Level::getBloc(int x, int y)
  56. {
  57. if (x<0 || x>=NB_BLOC_HORIZON || y>=NB_BLOC_VERTI)
  58. return BLOC;
  59. else if (y<0)
  60. return RIEN;
  61. else
  62. return m_tableau[y][x];
  63. }///getBloc
  64. void Level::afficher(SDL_Surface *screen)
  65. {
  66. // [1] Création de la position
  67. SDL_Rect position;
  68. // [2] Collage du niveau
  69. for (int i(0); i<NB_BLOC_HORIZON; i++)
  70. {
  71. for (int j(0); j<NB_BLOC_VERTI; j++)
  72. {
  73. position.x = i*LG_BLOC;
  74. position.y = j*LG_BLOC;
  75. if (m_tableau[j][i]==RIEN)
  76. /*Rien faire*/;
  77. else if (m_tableau[j][i]==BLOC)
  78. SDL_BlitSurface(m_bloc[0], 0, screen, &position);
  79. else if (m_tableau[j][i]==BUMPER)
  80. SDL_BlitSurface(m_bloc[1], 0, screen, &position);
  81. else if (m_tableau[j][i]==PLANCHE)
  82. SDL_BlitSurface(m_bloc[2], 0, screen, &position);
  83. }
  84. }
  85. SDL_BlitSurface(m_but, 0, screen, &m_posBut);
  86. SDL_BlitSurface(m_spawn,0,screen, &m_posSpawn);
  87. // [3] Collage du titre
  88. position.x=20;
  89. position.y=20;
  90. SDL_BlitSurface(m_titre, 0, screen, &position);
  91. }///afficher
  92. std::string const Level::getNom()
  93. {
  94. return m_nom;
  95. }
  96. void Level::lireParametres(int &xSpawn,int &ySpawn,float &resistance,float &gravite,int &xBut,int &yBut)
  97. {
  98. // [1] ouverture du flux
  99. std::string fichier("Niveaux/level "+convertirEntierEnCaracteres(m_numero)+".txt");
  100. std::cout << fichier << std::endl;//Introduction
  101. std::ifstream fluxIn(fichier.c_str());
  102. if (fluxIn)
  103. {
  104. // [2] On saute ce qui nous plaît pas
  105. for (int i(0);i<NB_BLOC_VERTI+2;i++)
  106. getline(fluxIn,fichier);//Là, le string fichier sert de poubelle
  107. // [3] Renseignement des paramètres
  108. fluxIn >> xSpawn;
  109. fluxIn >> ySpawn;
  110. fluxIn >> resistance;
  111. fluxIn >> gravite;
  112. fluxIn >> xBut;
  113. fluxIn >> yBut;
  114. m_posSpawn.x=xSpawn*LG_BLOC;
  115. m_posSpawn.y=ySpawn*LG_BLOC;
  116. m_posBut.x=xBut*LG_BLOC;
  117. m_posBut.y=yBut*LG_BLOC;
  118. // [4] Affichage infos
  119. std::cout << "Spawn("<<xSpawn<<";"<<ySpawn<<")."<<std::endl
  120. <<"Resistance: "<<resistance<<std::endl
  121. <<"Gravité: "<<gravite<<std::endl
  122. <<"But("<<xBut<<";"<<yBut<<")."<<std::endl<<std::endl;
  123. }//Fin de l'ouverture du fichier possible
  124. // [5] On previent s'il y a pépin
  125. else
  126. std::cout << "Echec de l'ouverture du fichier lors de la lecture des paramètres."<<std::endl;
  127. }///lireParametres
  128. /***===================={ Fonctions indépendantes }====================***/
  129. Level* haveLevel(std::string nomFichier)
  130. {
  131. // [1] Mise au poin du nom du fichier
  132. nomFichier="Niveaux/"+nomFichier;
  133. // [2] Ouverture du flux
  134. std::ifstream fluxIn(nomFichier.c_str());
  135. if (fluxIn)
  136. std::cout << "Ouverture du fichier "<<nomFichier<<" réussie."<<std::endl;
  137. else
  138. {
  139. std::cout << "Echec de l'ouverture du fichier "<<nomFichier<<"."<<std::endl;
  140. return 0;
  141. }
  142. // [3] Création des composants du niveau
  143. std::string nomNiveau;
  144. int numeroNiveau;
  145. int tableauNiveau[NB_BLOC_VERTI][NB_BLOC_HORIZON];
  146. // [4] Remplissage du niveau
  147. getline(fluxIn,nomNiveau);
  148. fluxIn >> numeroNiveau;
  149. for (int y(0); y<NB_BLOC_VERTI; y++)
  150. {
  151. for (int x(0); x<NB_BLOC_HORIZON; x++)
  152. {
  153. fluxIn >> tableauNiveau[y][x];
  154. }
  155. }
  156. // [5] Création de l'objet
  157. Level* niveau(0);
  158. niveau = new Level(nomNiveau,numeroNiveau,tableauNiveau);
  159. // [6] Renvoi du niveau
  160. return niveau;
  161. }