From 955f805ff147180599515da1cce57757fb2af322 Mon Sep 17 00:00:00 2001 From: Fife Date: Thu, 9 Jun 2016 20:45:46 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20syst=C3=A8me=20de=20map=20(=20pas?= =?UTF-8?q?=20fini=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CEngine.hpp | 29 +++++++ include/Engine.hpp | 17 ++++ include/Map/Level.hpp | 62 ++++++++++++++ include/Map/World.hpp | 48 +++++++++++ src/Components/Render.cpp | 18 +++-- src/Engine.cpp | 165 ++++++++++++++++++++++++++++++++++---- src/Map/Level.cpp | 162 +++++++++++++++++++++++++++++++++++++ src/Map/World.cpp | 98 ++++++++++++++++++++++ 8 files changed, 578 insertions(+), 21 deletions(-) create mode 100644 include/Map/Level.hpp create mode 100644 include/Map/World.hpp create mode 100644 src/Map/Level.cpp create mode 100644 src/Map/World.cpp diff --git a/CEngine.hpp b/CEngine.hpp index c612dff..2e40f38 100644 --- a/CEngine.hpp +++ b/CEngine.hpp @@ -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 */ diff --git a/include/Engine.hpp b/include/Engine.hpp index 4d1384d..072a625 100644 --- a/include/Engine.hpp +++ b/include/Engine.hpp @@ -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 }; diff --git a/include/Map/Level.hpp b/include/Map/Level.hpp new file mode 100644 index 0000000..018a762 --- /dev/null +++ b/include/Map/Level.hpp @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* _____ */ +/* Level.hpp | ___| _ ____ ___ */ +/* Project : C-Engine | |_ | | | __| / _ \ */ +/* | _| | | | |= | __/ */ +/* By: Fife |_| |_| |_| \___| */ +/* */ +/* */ +/* ************************************************************************** */ + +#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 diff --git a/include/Map/World.hpp b/include/Map/World.hpp new file mode 100644 index 0000000..14fc780 --- /dev/null +++ b/include/Map/World.hpp @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* _____ */ +/* World.hpp | ___| _ ____ ___ */ +/* Project : C-Engine | |_ | | | __| / _ \ */ +/* | _| | | | |= | __/ */ +/* By: Fife |_| |_| |_| \___| */ +/* */ +/* */ +/* ************************************************************************** */ + +#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 diff --git a/src/Components/Render.cpp b/src/Components/Render.cpp index be5b751..0c4cc07 100644 --- a/src/Components/Render.cpp +++ b/src/Components/Render.cpp @@ -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); + } + } } diff --git a/src/Engine.cpp b/src/Engine.cpp index cf70e3a..550563a 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -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 diff --git a/src/Map/Level.cpp b/src/Map/Level.cpp new file mode 100644 index 0000000..e002575 --- /dev/null +++ b/src/Map/Level.cpp @@ -0,0 +1,162 @@ +/* ************************************************************************** */ +/* _____ */ +/* Level.cpp | ___| _ ____ ___ */ +/* Project : C-Engine | |_ | | | __| / _ \ */ +/* | _| | | | |= | __/ */ +/* By: Fife |_| |_| |_| \___| */ +/* */ +/* */ +/* ************************************************************************** */ + +#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; + } + + + diff --git a/src/Map/World.cpp b/src/Map/World.cpp new file mode 100644 index 0000000..50fcbe9 --- /dev/null +++ b/src/Map/World.cpp @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* _____ */ +/* World.cpp | ___| _ ____ ___ */ +/* Project : C-Engine | |_ | | | __| / _ \ */ +/* | _| | | | |= | __/ */ +/* By: Fife |_| |_| |_| \___| */ +/* */ +/* */ +/* ************************************************************************** */ + +#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(); + } + } + }