Aller à la documentation de ce fichier.00001 #include <iostream>
00002 #include "cce/CoucheTile.hpp"
00003
00004 using sf::Vector2f;
00005 using cce::Tile;
00006
00007 namespace cce {
00008
00009
00010 CoucheTile::CoucheTile()
00011 {
00012 tiles = NULL;
00013 }
00014
00015 CoucheTile::~CoucheTile() {
00016
00017 }
00018
00019 Tile& CoucheTile::getTile(const int x, const int y) const
00020 {
00021 return tiles[y*largeur+x];
00022 }
00023
00024 void CoucheTile::setTile(const int id, const int x, const int y)
00025 {
00026 Tile t = getTile(x,y);
00027 t.setImage(id);
00028 t.calculCoordonnes(x,y);
00029 }
00030
00031 void CoucheTile::unsetTile(const int x, const int y)
00032 {
00033 getTile(x,y).unsetImage();
00034 }
00035
00036 void CoucheTile::lecture(LecteurFichier& flux) {
00037
00038 flux.allerSection("tiles");
00039 largeur = flux.lireInt();
00040 hauteur = flux.lireInt();
00041 flux.prochaineLigne();
00042
00043 nbTiles = largeur * hauteur;
00044 tiles = new Tile[nbTiles];
00045
00046 int x = 0 ;
00047 int y = 0 ;
00048 Tile *total = tiles + nbTiles;
00049
00050 for (Tile *p = tiles; p < total ;p++) {
00051 if (x>= largeur) {
00052 y++;
00053 x=0;
00054 }
00055
00056 int id = flux.lireIntVidePossible();
00057 if (id != -1)
00058 (*p).init(id,x,y);
00059 else
00060 (*p).unsetImage();
00061
00062 flux.prochaineLigne();
00063 x++;
00064 }
00065
00066 }
00067
00068 int CoucheTile::indiceDe(const int x_vue, const int y_vue) const {
00069 int x = x_vue/158;
00070 int y = y_vue/88;
00071
00072 int indice = (y*2)*largeur+x;
00073 if (tiles[indice].contientPoint(x_vue, y_vue))
00074 return indice;
00075
00076
00077 x = (x_vue - 79) / 158;
00078 y = (y_vue - 44) / 88;
00079 int indiceDecale = (y*2)*largeur+x + largeur;
00080 if (tiles[indiceDecale].contientPoint(x_vue, y_vue))
00081 return indiceDecale;
00082
00083 std::cout << "ERROR : impossible de trouver la tile du point (" << x_vue << ", " << y_vue << ") " << std::endl;
00084
00085 if (indice > 0 && indice < hauteur*largeur)
00086 return indice;
00087 else return 0;
00088 }
00089
00090
00091 void CoucheTile::dessinerSur(RenderTarget& cible) {
00092
00093 Vector2f centre = cible.GetView().GetCenter();
00094 const Vector2f taille = cible.GetView().GetSize();
00095
00096 int gauche = centre.x - taille.x/2;
00097 int haut = centre.y - taille.y /2;
00098
00099
00100 int indice_debut = indiceDe(gauche, haut);
00101 if (indice_debut - largeur >=0 )
00102 indice_debut -= largeur;
00103 if (indice_debut % largeur > 0 )
00104 indice_debut--;
00105 int nbTileLargeur = (taille.x / 158) +3;
00106 int nbTileHauteur = (taille.y / 88) +3;
00107
00108
00109 if ( indice_debut%largeur + nbTileLargeur >= largeur )
00110 nbTileLargeur = largeur - indice_debut%largeur;
00111 if ( indice_debut/largeur + nbTileHauteur*2 >= hauteur) {
00112 nbTileHauteur = (hauteur - (indice_debut/largeur))/2 + 1;
00113 if (ceil((float)((hauteur - (indice_debut/largeur))/2.)) == (hauteur - (indice_debut/largeur))/2)
00114 indice_debut-= 2*largeur;
00115 else
00116 indice_debut -= largeur;
00117 }
00118
00119
00120
00121
00122
00123 Tile *indice_ligne, *indice_colonne, *finLigne, *finColonne;
00124
00125 finLigne = tiles + indice_debut + (nbTileHauteur*largeur*2);
00126 for (indice_ligne = tiles + indice_debut ; indice_ligne < finLigne ; indice_ligne+=largeur ) {
00127 finColonne = indice_ligne + nbTileLargeur;
00128
00129 for (indice_colonne = indice_ligne; indice_colonne < finColonne ; indice_colonne++ ) {
00130 cible.Draw(*indice_colonne);
00131
00132
00133 }
00134 }
00135
00136
00137 }
00138
00139 int CoucheTile::getLargeur() const {
00140 return largeur * Tile::largeurTile ;
00141 }
00142
00143 int CoucheTile::getHauteur() const {
00144 return hauteur * Tile::hauteurTile ;
00145 }
00146
00147 }