/* ************************************************************************** */ /* _____ _ __ ___ __ */ /* Level.cpp | ___(_)/ _| ___ ( _ ) / /_ */ /* Project: C-Engine | |_ | | |_ / _ \/ _ \| '_ \ */ /* | _| | | _| __/ (_) | (_) | */ /* Author: Fife |_| |_|_| \___|\___/ \___/ */ /* */ /* ************************************************************************** */ #include "..\C-Engine\include\Level.hpp" Level::Level() { engineLink = NULL; listeObject = NULL; nbObject = 0; tileset = NULL; map = NULL; solid = NULL; tileHeight = 0; tileWidth = 0; tilegap = 0; levelHeight = 0; levelWidth = 0; } void Level::AffectEngine( Engine * v ) { engineLink = v; } Engine * Level::GetEngine() { return engineLink; } void Level::SetMap( const unsigned char * userTileset , unsigned char * userMap , bool * userProperties, int userTileWidth , int userTileHeight , int userWorldWidth , int userWorldHeight) { tileset = userTileset; map = userMap; solid = userProperties; tileWidth = userTileWidth; tileHeight = userTileHeight; tilegap = userTileHeight / 8; if(userTileHeight % 8)tilegap++; levelWidth = userWorldWidth; levelHeight = userWorldHeight; } int Level::GetIdMap( int x , int y , bool relative) { int id; int dx = x / tileWidth; int dy = levelHeight - y / tileHeight - 1; if(relative) id = *(map + levelWidth * dy + dx); else id = *(map + levelWidth * y + x); #ifdef CE_DELTA1 id --; #endif // CE_DELTA1 return id; } void Level::ReplaceIdMap( int x , int y , char v ) { *(map + levelWidth * y + x) = v; } void Level::DrawMap() { int dy = levelHeight * tileHeight - engineLink->GetScreen()->max.y ; int minx = engineLink->GetScreen()->min.x / tileWidth ; int miny = dy / tileHeight ; int maxx = 128 / tileWidth + minx + 2; int maxy = 64 / tileHeight + miny + 2; int xscroll = engineLink->GetScreen()->min.x ; int yscroll = dy % tileHeight; for( int i = minx; i < maxx; i++) { for( int j = miny ; j < maxy; j++) { if (!(i < 0 || i >= levelWidth || j < 0 || j >= levelHeight)) ML_bmp_or_cl( tileset + tileHeight * tilegap * GetIdMap(i,j) , (i * tileWidth ) - xscroll , ((j - miny) * tileHeight) - yscroll, tileWidth , tileHeight); } } } void Level::DrawLevel() { DrawMap(); for( int i = 0 ; i < GetNbObject() ; i++ ) { if( GetListeObject()[i]->GetEnable()) if(GetListeObject()[i]->GetRender()) GetListeObject()[i]->GetRender()->DrawObject(); } } Object ** Level::GetListeObject() { return listeObject; } int Level::GetNbObject() { return nbObject; } void Level::AddObject( Object * v) { Object ** Tab = listeObject; //On créai un pointeur sur la liste actuelle d'objet listeObject = (Object**) malloc( sizeof(Object *) * ( nbObject + 1 ) );//On alloue l'espace nécéssaire pour le nouveau tableau for( int i = 0 ; i < nbObject ; i++ )//On copie les pointeurs listeObject[i] = Tab[i]; listeObject[ nbObject ] = v; //Et on rajoute l'objet v->AffectEngine(GetEngine()); nbObject ++; delete Tab; } bool Level::DelObject( Object * v , bool destroy) { Object ** Tab = listeObject; int index = -1; if(!Tab)return false; for( int i = 0 ; i < nbObject ; i++ ) if(Tab[i] == v ) index = i ; if(index == -1)return false; listeObject = (Object**) malloc( sizeof(Object *) * ( nbObject - 1) ); for( int i = 0 ; i < index ; i++ ) listeObject[ i ] = Tab[ i ]; for(int i = index + 1 ; i < nbObject ; i++ ) listeObject[ i - 1] = Tab[ i ]; nbObject --; if(destroy)delete v; delete Tab; return true; } void Level::DelAllObject() { for(int i = 0 ; i < nbObject ; i++) delete listeObject[i]; delete listeObject; listeObject = NULL; }