Ajout du système de map ( pas fini )

This commit is contained in:
Fife 2016-06-09 20:45:46 +01:00
parent 07ae63f741
commit 955f805ff1
8 changed files with 578 additions and 21 deletions

View File

@ -32,6 +32,7 @@
//#define CE_ALL
#define CE_BASIC
#define CE_MAP
//#define CE_RPG
//#define CE_PLATEFORME
//#define CE_NETWORK
@ -41,8 +42,11 @@
#define CE_RPG
#define CE_PLATEFORME
#define CE_NETWORK
#define CE_MAP
#endif
//*********Declaration**********//
#ifdef CE_BASIC
class Engine;
@ -67,6 +71,12 @@
double y;
};
struct AABB
{
Vec2 min;
Vec2 max;
};
struct Body
{
Transform * transform;
@ -75,7 +85,18 @@
Vec2 acceleration;
Vec2 force;
};
#endif
#ifdef CE_MAP
class Level;
class World;
#endif
//********Include**********//
#ifdef CE_BASIC
#include "include\Engine.hpp"
#include "include\Object.hpp"
@ -88,4 +109,12 @@
#endif
#ifdef CE_MAP
#include "include\Map\World.hpp" //Les différents composant du décor du jeu
#include "include\Map\Level.hpp"
#endif
#endif /* CENGINE_HPP */

View File

@ -38,8 +38,19 @@
void AppliedForce();
void Draw();
AABB * GetScreen();
void MoveScreen( int x ,int y);
void MiddleScreen(int x , int y , bool fixe = true);
void UpdateRelativePosition();
#ifdef CE_MAP
World * GetWorld();
void SetWorld( World * v);
#endif
private:
bool execute;
@ -50,7 +61,13 @@
Object ** listeObject; //Tableau d'objet utilisé dans le cas ou il n'y a pas de map.
int nbobject; //Nombre d'objet liés au moteur. nb = Nombre
AABB screen;
#ifdef CE_MAP
World * engineWorld;
#endif
};

62
include/Map/Level.hpp Normal file
View File

@ -0,0 +1,62 @@
/* ************************************************************************** */
/* _____ */
/* Level.hpp | ___| _ ____ ___ */
/* Project : C-Engine | |_ | | | __| / _ \ */
/* | _| | | | |= | __/ */
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
/* */
/* */
/* ************************************************************************** */
#ifndef CENGINE_LEVEL_HPP
#define CENGINE_LEVEL_HPP
#include "..\Rework\CEngine.hpp"
class Level
{
public:
Level();//Constructeur
void AffectWorld( World * v );
World * GetWorld();
void SetMap( const unsigned char * userTileset , unsigned char * userMap , bool * userProperties, int userTileWidth , int userTileHeight , int userWorldWidth , int userWorldHeight);
int GetIdMap( int x, int y );
void ReplaceIdMap( int x , int y, char v );
void DrawMap();
Object ** GetListeObject();
int GetNbObject();
void AddObject( Object * v); //Ajout un objet au level
bool DelObject( Object * v); //Supprime l'objet
void DelAllObject(); //Supprime tout les objets
int tileWidth;
int tileHeight;
int levelWidth;
int levelHeight;
private:
World * worldLink;
unsigned char * map;
const unsigned char * tileset;
bool * solid;
int tilegap;
int xscroll,yscroll;
Object ** listeObject;
int nbObject;
};
#endif

48
include/Map/World.hpp Normal file
View File

@ -0,0 +1,48 @@
/* ************************************************************************** */
/* _____ */
/* World.hpp | ___| _ ____ ___ */
/* Project : C-Engine | |_ | | | __| / _ \ */
/* | _| | | | |= | __/ */
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
/* */
/* */
/* ************************************************************************** */
#ifndef CENGINE_WORLD_HPP
#define CENGINE_WORLD_HPP
#include "..\Rework\CEngine.hpp"
class World
{
public:
World();//Constructeur
void AffectEngine(Engine * EV);
Engine * GetEngine();
void SetLevel( Level ** userTabLevel , int userNbLevel);
void SetLevel( Level * userLevel);
void DrawLevel();
Level * GetCurrentLevel();
Level * GetLevel(int id);
void AddObject( Object * v, int level = -1); //Ajout un objet au level
void DelObject( Object * v); //Supprime l'objet
void DelAllObject(); //Supprime tout les objets
private:
Engine * engineLink;
Level ** tabLevel;
int nbLevel;
int currentLevel;
};
#endif

View File

@ -67,11 +67,12 @@
void Render::SetIt(int v)
{
/*if(iterateur != v && (!TabAnim[iterateur].GetWaittheEnd() || TabAnim[iterateur].GetisEnd()))
{*/
if(iterateur != v /*&& (!TabAnim[iterateur].GetWaittheEnd() || TabAnim[iterateur].GetisEnd())*/)
{
iterateur = v;
if( iterateur >= nb_anim) iterateur = 0;
TabAnim[ iterateur].SetIt(0);
// }
}
}
int Render::GetIt()
@ -136,11 +137,14 @@
{
if(TabAnim)
{
if( iterateur >= nb_anim) iterateur = 0;
if(!reverse)
TabAnim[ iterateur].DrawAnim( Conteneur->GetTransform()->GetRelativeX() , 64 - Conteneur->GetTransform()->GetRelativeY() - GetSizeY() , direction);
{
TabAnim[ iterateur ].DrawAnim( Conteneur->GetTransform()->GetRelativeX() , 64 - Conteneur->GetTransform()->GetRelativeY() - GetSizeY() , direction);
}
else
TabAnim[ iterateur].DrawReverseAnim( Conteneur->GetTransform()->GetRelativeX() , 64 - Conteneur->GetTransform()->GetRelativeY() - GetSizeY() , direction);
{
TabAnim[ iterateur].DrawReverseAnim( Conteneur->GetTransform()->GetRelativeX() , 64 - Conteneur->GetTransform()->GetRelativeY() - GetSizeY() , direction);
}
}
}

View File

@ -8,6 +8,20 @@
/* */
/* ************************************************************************** */
/*
bool Engine::WaitOneSecond()
{
if(RTC_getTicks() - time > 128) // si il s'est écoulé une seconde complète
{
time = RTC_getTicks(); // et on se rappelle du nombre de ticks de la dernière seconde écoulée
return true;
}
return false;
}
*/
#include "..\Rework\include\Engine.hpp"
Engine::Engine()
@ -19,6 +33,17 @@
listeObject = NULL;
nbobject = 0;
screen.min.x = 0;
screen.min.y = 0;
screen.max.x = 128;
screen.max.y = 64;
#ifdef CE_MAP
engineWorld = NULL;
#endif
}
void Engine::StartGame()
@ -77,6 +102,14 @@
void Engine::AddObject( Object * v)
{
#ifdef CE_MAP
if(engineWorld)
{
engineWorld->AddObject(v);
return;
}
#endif
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
@ -94,6 +127,14 @@
void Engine::DelObject( Object * v)
{
#ifdef CE_MAP
if(engineWorld)
{
engineWorld->DelObject(v);
return;
}
#endif
Object ** Tab = listeObject;
int index = -1;
@ -120,6 +161,13 @@
void Engine::DelAllObject()
{
#ifdef CE_MAP
if(engineWorld)
{
engineWorld->DelAllObject();
}
#endif
for(int i = 0 ; i < nbobject ; i++)
delete listeObject[i];
@ -159,6 +207,30 @@
void Engine::Draw()
{
#ifdef CE_MAP
if(engineWorld)
{
engineWorld->GetCurrentLevel()->DrawMap();
for( int i = 0 ; i < engineWorld->GetCurrentLevel()->GetNbObject() ; i++ )
{
if( engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetEnable())
if(engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetRender())
engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetRender()->DrawObject();
}
}
else
{
for( int i = 0 ; i < nbobject ; i++ )
{
if( listeObject[i]->GetEnable())
if(listeObject[i]->GetRender())
listeObject[i]->GetRender()->DrawObject();
}
}
#else
for( int i = 0 ; i < nbobject ; i++ )
{
if( listeObject[i]->GetEnable())
@ -166,31 +238,96 @@
listeObject[i]->GetRender()->DrawObject();
}
if(fps)
PrintV(110,2,getFps());
#endif
if(fps) PrintV(110,2,getFps());
}
/*
bool Engine::WaitOneSecond()
AABB * Engine::GetScreen()
{
if(RTC_getTicks() - time > 128) // si il s'est écoulé une seconde complète
{
time = RTC_getTicks(); // et on se rappelle du nombre de ticks de la dernière seconde écoulée
return true;
}
return false;
return &screen;
}
*/
void Engine::MoveScreen(int x , int y)
{
screen.min.x = x;
screen.max.x = x + 64;
screen.min.y = y;
screen.max.y = y + 128;
}
void Engine::MiddleScreen(int x , int y , bool fixe)
{
screen.min.x = x - 32;
screen.max.x = x + 32;
screen.min.y = y - 64;
screen.max.y = y + 64;
if(fixe)
{
if( screen.min.x < 0 )
{
screen.min.x = 0;
screen.max.x = 128;
}
if(screen.min.y < 0)
{
screen.min.y = 0;
screen.max.y = 63;
}
#ifdef CE_MAP
if(engineWorld)
{
if(screen.max.x > engineWorld->GetCurrentLevel()->levelWidth * engineWorld->GetCurrentLevel()->tileWidth)
{
screen.max.x = engineWorld->GetCurrentLevel()->levelWidth * engineWorld->GetCurrentLevel()->tileWidth;
screen.min.x = screen.max.x - 128;
}
if(screen.max.y > engineWorld->GetCurrentLevel()->levelHeight * engineWorld->GetCurrentLevel()->tileHeight)
{
screen.max.y = engineWorld->GetCurrentLevel()->levelHeight * engineWorld->GetCurrentLevel()->tileHeight;
screen.min.y = screen.max.y - 64;
}
}
#endif // CE_MAP
}
}
void Engine::UpdateRelativePosition()
{
#ifdef CE_MAP
if(engineWorld)
{
for( int i = 0 ; i < engineWorld->GetCurrentLevel()->GetNbObject() ; i++ )
{
if( engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetEnable())
engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetTransform()->SetRelativeXY( engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetTransform()->GetX() - screen.min.x , engineWorld->GetCurrentLevel()->GetListeObject()[i]->GetTransform()->GetY() - screen.min.y );
}
}
#endif // CE_MAP
for( int i = 0 ; i < nbobject; i++ )
{
if(listeObject[i]->GetEnable())
listeObject[i]->GetTransform()->SetRelativeXY( listeObject[i]->GetTransform()->GetX() , listeObject[i]->GetTransform()->GetY() );
listeObject[i]->GetTransform()->SetRelativeXY( listeObject[i]->GetTransform()->GetX() - screen.min.x , listeObject[i]->GetTransform()->GetY() - screen.min.y );
}
}
#ifdef CE_MAP
World * Engine::GetWorld()
{
return engineWorld;
}
void Engine::SetWorld( World * v)
{
engineWorld = v;
engineWorld->AffectEngine(this);
}
#endif

162
src/Map/Level.cpp Normal file
View File

@ -0,0 +1,162 @@
/* ************************************************************************** */
/* _____ */
/* Level.cpp | ___| _ ____ ___ */
/* Project : C-Engine | |_ | | | __| / _ \ */
/* | _| | | | |= | __/ */
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
/* */
/* */
/* ************************************************************************** */
#include "..\Rework\include\Map\Level.hpp"
Level::Level()
{
worldLink = NULL;
listeObject = NULL;
nbObject = 0;
tileset = NULL;
map = NULL;
solid = NULL;
tileHeight = 0;
tileWidth = 0;
tilegap = 0;
levelHeight = 0;
levelWidth = 0;
xscroll = 0;
yscroll = 0;
}
void Level::AffectWorld( World * v )
{
worldLink = v;
}
World * Level::GetWorld()
{
return worldLink;
}
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 )
{
return *(map + levelWidth * y + x);
}
void Level::ReplaceIdMap( int x , int y , char v )
{
*(map + levelWidth * y + x) = v;
}
void Level::DrawMap()
{
int minx,maxx,miny,maxy;
int dy = levelHeight * tileHeight - worldLink->GetEngine()->GetScreen()->max.y ;
minx = worldLink->GetEngine()->GetScreen()->min.x / tileWidth ;
miny = dy / tileHeight ;
maxx = 128 / tileWidth + minx + 2;
maxy = 64 / tileHeight + miny + 2;
xscroll = worldLink->GetEngine()->GetScreen()->min.x ;
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);
}
}
}
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(GetWorld()->GetEngine());
nbObject ++;
delete Tab;
}
bool Level::DelObject( Object * v)
{
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 --;
delete v;
delete Tab;
return true;
}
void Level::DelAllObject()
{
for(int i = 0 ; i < nbObject ; i++)
delete listeObject[i];
delete listeObject;
listeObject = NULL;
}

98
src/Map/World.cpp Normal file
View File

@ -0,0 +1,98 @@
/* ************************************************************************** */
/* _____ */
/* World.cpp | ___| _ ____ ___ */
/* Project : C-Engine | |_ | | | __| / _ \ */
/* | _| | | | |= | __/ */
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
/* */
/* */
/* ************************************************************************** */
#include "..\Rework\include\Map\World.hpp"
World::World()
{
tabLevel = NULL;
nbLevel = 0;
currentLevel = 0;
engineLink = NULL;
}
void World::AffectEngine(Engine * EV)
{
engineLink = EV;
}
Engine * World::GetEngine()
{
return engineLink;
}
void World::SetLevel( Level ** userTabLevel , int userNbLevel)
{
tabLevel = userTabLevel;
nbLevel = userNbLevel;
for(int i = 0 ; i < nbLevel ; i++ )
tabLevel[i]->AffectWorld(this);
}
void World::SetLevel( Level * userLevel)
{
tabLevel = new Level*[1];
tabLevel[0] = userLevel;
nbLevel = 1;
userLevel->AffectWorld(this);
}
void World::DrawLevel()
{
if(tabLevel)tabLevel[currentLevel]->DrawMap();
}
Level * World::GetCurrentLevel()
{
return tabLevel[currentLevel];
}
Level * World::GetLevel(int id)
{
return tabLevel[id];
}
void World::AddObject( Object * v, int level)
{
if(level < 0 && tabLevel)tabLevel[currentLevel]->AddObject(v);
if( level < nbLevel && level >= 0 && tabLevel)
{
tabLevel[level]->AddObject(v);
}
}
void World::DelObject( Object * v)
{
if(tabLevel)
{
if(!tabLevel[currentLevel]->DelObject(v))
{
for(int i = 0 ; i < nbLevel ; i++ )
{
if(tabLevel[i]->DelObject(v))return;
}
}
}
}
void World::DelAllObject()
{
if(tabLevel)
{
for(int i = 0 ; i < nbLevel ; i++ )
{
tabLevel[i]->DelAllObject();
}
}
}