123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- #include "Niveau.h"
- Niveau::Niveau(SpriteLoader* spriteGet) : m_terrain(0), m_spriteGet(spriteGet)
- {
- // Surface du terrain
- m_terrain = SDL_CreateRGBSurface(SDL_HWSURFACE, 24*40, 18*40, 32, 0, 0, 0, 0);
- // Remplissage tableau
- for (Uint16 y(0); y < 18; y++)
- for (Uint16 x(0); x < 24; x++)
- m_tabl[y][x] = '#';
- // Association noms aux chars
- m_pass['#'] = "mur";
- m_pass[' '] = "sol";
- m_pass[36] = "end";//'$'
- //Association couleurs lettres
- Uint32 tab[26] = {0xffff0000, 0xff00ff00, 0x00ffff00, 0xff000000, 0x00ff0000, 0x0000ff00, 0xff770000, 0x00ff7700, 0x7700ff00, 0xff777700, 0x77ff7700, 0x7777ff00, 0x8c551500, 0xff00e000, 0x88880000, 0x88008800, 0x00888800, 0x2cb15800, 0x2cb15800, 0x008ebc00, 0x00bc5400, 0x6fbc0000, 0x6fbc0000, 0xff875200, 0xe56dff00, 0x00000000};
- for(int i = 0;i<26;i++)
- tabColor[i] = tab[i];
- // Création des persos
- m_perso[0].skin = m_spriteGet->takeSprite("bleu");
- m_perso[1].skin = m_spriteGet->takeSprite("rouge");
- m_perso[0].y = m_perso[1].y = 8;
- m_perso[0].x = m_perso[1].x = 12;
- SDL_SetColorKey(m_perso[0].skin, SDL_SRCCOLORKEY, 0xffffffff);
- SDL_SetColorKey(m_perso[1].skin, SDL_SRCCOLORKEY, 0xffffffff);
- //Création des
- SDL_SetColorKey(m_spriteGet->takeSprite("boutonA"), SDL_SRCCOLORKEY, 0xff000000);
- SDL_SetColorKey(m_spriteGet->takeSprite("boutonR"), SDL_SRCCOLORKEY, 0xff000000);
- SDL_SetColorKey(m_spriteGet->takeSprite("porteO"), SDL_SRCCOLORKEY, 0xff000000);
- SDL_SetColorKey(m_spriteGet->takeSprite("porteF"), SDL_SRCCOLORKEY, 0xff000000);
- }
- Niveau::~Niveau()
- {
- SDL_FreeSurface(m_terrain);
- }
- void Niveau::majLevel(char newTerrain[18][24])
- {
- // Nettoyage de la map
- m_gates.clear();
- for(unsigned int y = 0; y<18; y++) for(unsigned int x = 0; x<24; x++) m_caisses[y][x] = false;
- // Balayage
- for (Uint16 y(0); y < 18; y++)
- for (Uint16 x(0); x < 24; x++)
- {
- // Valeur
- m_tabl[y][x] = newTerrain[y][x];
- // Pêche aux infos
- if (m_tabl[y][x] == '0') {
- m_perso[0].y = y;
- m_perso[0].x = x;
- m_tabl[y][x] = ' ';
- }
- if (m_tabl[y][x] == '1') {
- m_perso[1].y = y;
- m_perso[1].x = x;
- m_tabl[y][x] = ' ';
- }
- if(m_tabl[y][x] == '*')
- {
- m_caisses[y][x] = true;
- m_tabl[y][x] = ' ';
- }
- m_blitPos.x = x*40;
- m_blitPos.y = y*40;
- if(m_tabl[y][x] >= 97 && m_tabl[y][x] <= 122)//Minuscules
- {
- m_gates[m_tabl[y][x]].first = false;
- m_gates[m_tabl[y][x]].second[0].push_back(x);
- m_gates[m_tabl[y][x]].second[0].push_back(y);
- SDL_BlitSurface(m_spriteGet->takeSprite(m_pass[' ']), 0, m_terrain, &m_blitPos);
- }
- else if(m_tabl[y][x] >= 65 && m_tabl[y][x] <= 90)//majuscules
- {
- m_gates[tolower(m_tabl[y][x])].second[1].push_back(x);
- m_gates[tolower(m_tabl[y][x])].second[1].push_back(y);
- SDL_BlitSurface(m_spriteGet->takeSprite(m_pass[' ']), 0, m_terrain, &m_blitPos);
- }
- else //blit si ce n'est ni porte ni bouton
- {
- SDL_BlitSurface(m_spriteGet->takeSprite(m_pass[m_tabl[y][x]]), 0, m_terrain, &m_blitPos);
- }
- }
- }
- void Niveau::afficher(SDL_Surface* screen)
- {
- // Sol
- SDL_BlitSurface(m_terrain, 0, screen, 0);
- //affichage des potres/boutons ouvertes/fermées
- SDL_Surface *tmpSurface;
- for(std::map<char, std::pair<bool, std::vector<int>[2] > >::iterator tmp_gates = m_gates.begin(); tmp_gates!=m_gates.end(); tmp_gates++)
- {
- int index = (int)tmp_gates->first-97;
- //boutons
- tmpSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, 40, 40, 32, m_spriteGet->takeSprite("boutonA")->format->Rmask, m_spriteGet->takeSprite("boutonA")->format->Gmask, m_spriteGet->takeSprite("boutonA")->format->Bmask, m_spriteGet->takeSprite("boutonA")->format->Amask);
- SDL_FillRect(tmpSurface, 0, tabColor[index]);
- if(tmp_gates->second.first)
- SDL_BlitSurface(m_spriteGet->takeSprite("boutonA"), 0, tmpSurface, 0);
- else
- SDL_BlitSurface(m_spriteGet->takeSprite("boutonR"), 0, tmpSurface, 0);
- for(unsigned int i = 0;i<tmp_gates->second.second[0].size();i+=2)
- {
- m_blitPos.x = tmp_gates->second.second[0][i]*40;
- m_blitPos.y = tmp_gates->second.second[0][i+1]*40;
- SDL_SetColorKey(tmpSurface, SDL_SRCCOLORKEY, 0xffffff00);
- SDL_BlitSurface(tmpSurface, 0, screen, &m_blitPos);
- }
- SDL_FreeSurface(tmpSurface);
- //portes
- tmpSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, 40, 40, 32, m_spriteGet->takeSprite("porteO")->format->Rmask, m_spriteGet->takeSprite("boutonA")->format->Gmask, m_spriteGet->takeSprite("boutonA")->format->Bmask, m_spriteGet->takeSprite("boutonA")->format->Amask);
- SDL_FillRect(tmpSurface, 0, tabColor[index]);
- if(tmp_gates->second.first)
- SDL_BlitSurface(m_spriteGet->takeSprite("porteO"), 0, tmpSurface, 0);
- else
- SDL_BlitSurface(m_spriteGet->takeSprite("porteF"), 0, tmpSurface, 0);
- for(unsigned int i = 0;i<tmp_gates->second.second[1].size();i+=2)
- {
- m_blitPos.x = tmp_gates->second.second[1][i]*40;
- m_blitPos.y = tmp_gates->second.second[1][i+1]*40;
- SDL_SetColorKey(tmpSurface, SDL_SRCCOLORKEY, 0xffffff00);
- SDL_BlitSurface(tmpSurface, 0, screen, &m_blitPos);
- }
- SDL_FreeSurface(tmpSurface);
- }
- // Caisses
- for (Uint16 y(0); y < 18; y++)
- for (Uint16 x(0); x < 24; x++)
- if (m_caisses[y][x])
- {
- m_blitPos.x = x*40;
- m_blitPos.y = y*40;
- SDL_BlitSurface(m_spriteGet->takeSprite("caisse"), 0, screen, &m_blitPos);
- }
- // Bonhommes
- for (Uint16 i(0); i<=1; i++) {
- m_blitPos.x = m_perso[i].x*40;
- m_blitPos.y = m_perso[i].y*40;
- SDL_BlitSurface(m_perso[i].skin, 0, screen, &m_blitPos);
- }
- }
- bool Niveau::test(Uint16 y, Uint16 x, short dirX, short dirY)
- {
- // Mur ?
- if (m_tabl[y][x] == '#')
- return false;
- // Porte fermée ?
- if(m_tabl[y][x] >= 65 && m_tabl[y][x] <= 90)
- if (!m_gates[tolower(m_tabl[y][x])].first)
- return false;
- // Collisions caisse
- if (m_caisses[y][x]) {
- if(m_tabl[y+dirY][x+dirX] == '#')
- return false;
- if(m_tabl[y+dirY][x+dirX] >= 65 && m_tabl[y+dirY][x+dirX] <= 90)
- {
- if(m_gates[tolower(m_tabl[y+dirY][x+dirX])].first)
- {
- m_caisses[y][x] = false;
- m_caisses[y + dirY][x + dirX] = true;
- return true;
- }
- else
- return false;
- }
- else
- {
- m_caisses[y][x] = false;
- m_caisses[y + dirY][x + dirX] = true;
- return true;
- }
- }
- // Si rien n'empêche ...
- return true;
- }
- char Niveau::getCase(Uint16 y, Uint16 x)
- {
- if (y < 18 && x < 24)
- return m_tabl[y][x];
- return '#';
- }
- void Niveau::setCase(Uint16 y, Uint16 x, char bloc)
- {
- if (y < 18 && x < 24)
- m_tabl[y][x] = bloc;
- }
- bool Niveau::deplacer(char ID, char ordre)
- {
- // Détermination du joueur qui bouge
- Uint16 ind;
- if (ID == '0') ind = 0;
- else ind = 1;
- // Détermination de la direction
- short dirX(0), dirY(0);
- switch (ordre)
- {
- case 24://'↑'
- dirY--;
- break;
- case 25://'↓'
- dirY++;
- break;
- case 26://'→'
- dirX++;
- break;
- case 27://'←'
- dirX--;
- break;
- default:
- break;
- }
- // Collisions bonhomme
- for(std::map<char, std::pair<bool, std::vector<int>[2] > >::iterator tmp_gates = m_gates.begin(); tmp_gates!=m_gates.end(); tmp_gates++)
- for(unsigned int i = 0;i<tmp_gates->second.second[1].size();i+=2)
- if(tmp_gates->second.second[1][i] == m_perso[ind].x && tmp_gates->second.second[1][i+1] == m_perso[ind].y)
- {
- if(tmp_gates->second.first)
- break;
- else
- return false;
- }
- if (test(m_perso[ind].y+dirY, m_perso[ind].x+dirX, dirX, dirY)) {
- m_perso[ind].y += dirY;
- m_perso[ind].x += dirX;
- }
- return true;
- }
- void Niveau::updateBoutons()
- {
- // Vérifie si un bouton est activé par une caisse A BOUGER
- for(std::map<char, std::pair<bool, std::vector<int>[2] > >::iterator tmp_gates = m_gates.begin(); tmp_gates!=m_gates.end(); tmp_gates++)
- {
- tmp_gates->second.first = false;
- for(unsigned int i = 0;i<tmp_gates->second.second[0].size();i+=2)
- tmp_gates->second.first |= m_caisses[tmp_gates->second.second[0][i+1]][tmp_gates->second.second[0][i]];
- }
- // Vérifie perso on bouton
- int x, y;
- for (Uint16 i(0); i<=1; i++) {
- x = m_perso[i].x;
- y = m_perso[i].y;
- if(m_tabl[y][x] >= 97 && m_tabl[y][x] <= 122)
- m_gates[m_tabl[y][x]].first = true;
- }
- //destruction si caisse sur porte fermée
- for(std::map<char, std::pair<bool, std::vector<int>[2] > >::iterator tmp_gates = m_gates.begin(); tmp_gates!=m_gates.end(); tmp_gates++)
- for(unsigned int i = 0;i<tmp_gates->second.second[1].size();i+=2)
- if(!tmp_gates->second.first && m_caisses[tmp_gates->second.second[1][i+1]][tmp_gates->second.second[1][i]])
- m_caisses[tmp_gates->second.second[1][i+1]][tmp_gates->second.second[1][i]] = false;
- }
- bool Niveau::suisJeArrive(char ID)
- {
- // Détermination du joueur qui bouge
- Uint16 ind;
- if (ID == '0') ind = 0;
- else ind = 1;
- // Retour
- return (m_tabl[m_perso[ind].y][m_perso[ind].x] == 36);//'$'
- }
|