184 lines
4.2 KiB
C++
184 lines
4.2 KiB
C++
/* ************************************************************************** */
|
||
/* _____ _ __ ___ __ */
|
||
/* Level.cpp | ___(_)/ _| ___ ( _ ) / /_ */
|
||
/* Project: C-Engine | |_ | | |_ / _ \/ _ \| '_ \ */
|
||
/* | _| | | _| __/ (_) | (_) | */
|
||
/* Author: Fife <wasabifife@gmail.com> |_| |_|_| \___|\___/ \___/ */
|
||
/* */
|
||
/* ************************************************************************** */
|
||
|
||
#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<63>ai un pointeur sur la liste actuelle d'objet
|
||
|
||
listeObject = (Object**) malloc( sizeof(Object *) * ( nbObject + 1 ) );//On alloue l'espace n<>c<EFBFBD>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;
|
||
}
|