From 22f45b7a59f0c93822785e272246aef34f286bad Mon Sep 17 00:00:00 2001 From: Fife Date: Tue, 14 Jun 2016 14:39:24 +0100 Subject: [PATCH] Ajout des triggers --- CEngine.hpp | 5 +++ include/Engine.hpp | 4 ++ include/Object.hpp | 22 +++++++++- include/Object/Animation.hpp | 3 ++ include/Object/Render.hpp | 1 + include/Object/Script.hpp | 20 ++++++++- otherlib/FonctionC.c | 5 +++ otherlib/FonctionC.h | 1 + src/Engine.cpp | 11 +++++ src/Level.cpp | 12 ++++- src/Object.cpp | 14 ++++-- src/Object/Animation.cpp | 11 ++++- src/Object/Render.cpp | 9 +++- src/Object/Script.cpp | 7 +++ src/Trigger.cpp | 85 ++++++++++++++++++++++++++++++++++++ 15 files changed, 198 insertions(+), 12 deletions(-) create mode 100644 src/Trigger.cpp diff --git a/CEngine.hpp b/CEngine.hpp index d5e65dd..f476c40 100644 --- a/CEngine.hpp +++ b/CEngine.hpp @@ -34,6 +34,7 @@ //#define CE_RPG #define CE_PLATEFORME //#define CE_NETWORK + #define CE_DELTA1 #ifdef CE_ALL @@ -59,6 +60,9 @@ class Script; class Level; + class Trigger; + class Trigger_Script; + struct MassData { float mass; @@ -91,6 +95,7 @@ #ifdef CE_BASIC + #include "include\Engine.hpp" #include "include\Object.hpp" #include "include\Level.hpp" diff --git a/include/Engine.hpp b/include/Engine.hpp index 19e13bc..521e48b 100644 --- a/include/Engine.hpp +++ b/include/Engine.hpp @@ -57,6 +57,8 @@ class Engine bool WaitOneSecond(); void ExecuteScriptSecond(); + void AffectGui(Script * Gui); + private: @@ -65,6 +67,8 @@ class Engine int fpswish; bool fps; + Script * engineScript; + 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 diff --git a/include/Object.hpp b/include/Object.hpp index 43819b6..1bfbacf 100644 --- a/include/Object.hpp +++ b/include/Object.hpp @@ -46,8 +46,9 @@ class Object bool IsOnScreen(); bool Collision(int id , Level * l = NULL); + bool TestTag(char * v); - private: + protected: Transform * OTransform; Render * ORender; @@ -60,4 +61,23 @@ class Object }; +class Trigger: public Object +{ + public: + + Trigger(); //Constructeur + ~Trigger(); + + void CreateTrigger(int x , int y , int width , int height ); + void SetDestination(int x , int y , int level); + + Vec2 GetDestination(); + int GetDestinationLevel(); + + private: + + Vec2 destination; + int leveldestination; +}; + #endif diff --git a/include/Object/Animation.hpp b/include/Object/Animation.hpp index ab036b6..6aac414 100644 --- a/include/Object/Animation.hpp +++ b/include/Object/Animation.hpp @@ -28,6 +28,9 @@ class Animation int GetBlitX(); int GetBlitY(); + bool GetWaittheEnd(); + bool GetisEnd(); + void DrawReverseAnim( int , int , int); void DrawAnim( int , int , int ); diff --git a/include/Object/Render.hpp b/include/Object/Render.hpp index 9890750..5c13047 100644 --- a/include/Object/Render.hpp +++ b/include/Object/Render.hpp @@ -26,6 +26,7 @@ class Render void CopieRender(Animation & v); void SetIt( int v ); + void ForceSetIt( int v ); int GetIt(); void ReverseRender(bool); diff --git a/include/Object/Script.hpp b/include/Object/Script.hpp index fa898ab..90afc7f 100644 --- a/include/Object/Script.hpp +++ b/include/Object/Script.hpp @@ -21,6 +21,7 @@ class Script virtual void Update(); virtual void UpdateEverySecond(); virtual void Start(); + virtual void Teleport( int x , int y , int level ); void AffectObject(Object * OV); void AffectEngine(Engine * EV); @@ -28,11 +29,26 @@ class Script Engine * GetEngine(); Object * GetObject(); - private: + protected: Object * OConteneur; Engine * EConteneur; - }; +}; + +class Trigger_Script: public Script +{ + public: + + void Update(); + + void AffectTrigger(Trigger * TV); + Trigger * GetTrigger(); + + private: + + Trigger * TConteneur; +}; + #endif diff --git a/otherlib/FonctionC.c b/otherlib/FonctionC.c index 30875e9..81c8007 100644 --- a/otherlib/FonctionC.c +++ b/otherlib/FonctionC.c @@ -39,6 +39,11 @@ return 0; } +int mod(int a, int b) +{ + return a % b; +} + int getFps() { // variables utilisées (en static, pour pouvoir garder en mémoire les valeurs) diff --git a/otherlib/FonctionC.h b/otherlib/FonctionC.h index ae2473f..c01db14 100644 --- a/otherlib/FonctionC.h +++ b/otherlib/FonctionC.h @@ -5,6 +5,7 @@ int PrintV(int x, int y, int v); int getFps(); void setFps(int fpsWish); int getDelay( int ms); +int mod(int a, int b); int RTC_getTicks(void); diff --git a/src/Engine.cpp b/src/Engine.cpp index 08b9fda..705268c 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -68,6 +68,8 @@ void Engine::InitGame() for( int i = 0 ; i < nbLevel ; i++ ) for( int j = 0 ; j < tabLevel[i]->GetNbObject() ; j++ ) if(tabLevel[i]->GetListeObject()[j]->GetScript() && tabLevel[i]->GetListeObject()[j]->GetEnable())tabLevel[i]->GetListeObject()[j]->GetScript()->Start(); + + if(engineScript)engineScript->Start(); } void Engine::StopGame() @@ -190,6 +192,7 @@ void Engine::ExecuteScript() if(WaitOneSecond()) { ExecuteScriptSecond(); + if(engineScript)engineScript->UpdateEverySecond(); } if(tabLevel && currentLevel != -1) @@ -257,6 +260,8 @@ void Engine::Draw() } } + if(engineScript)engineScript->Update(); + if(fps) PrintV(110,2,getFps()); } @@ -417,3 +422,9 @@ void Engine::ExecuteScriptSecond() } } } + +void Engine::AffectGui(Script * Gui) +{ + engineScript = Gui; + if(engineScript)engineScript->AffectEngine(this); +} diff --git a/src/Level.cpp b/src/Level.cpp index efe0969..5d1de0f 100644 --- a/src/Level.cpp +++ b/src/Level.cpp @@ -58,7 +58,15 @@ void Level::SetMap( const unsigned char * userTileset , unsigned char * userMap int Level::GetIdMap( int x , int y ) { - return *(map + levelWidth * y + x); + int id = *(map + levelWidth * y + x); + + #ifdef CE_DELTA1 + + id --; + + #endif // CE_DELTA1 + + return id; } void Level::ReplaceIdMap( int x , int y , char v ) @@ -84,7 +92,7 @@ void Level::DrawMap() 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); + ML_bmp_or_cl( tileset + tileHeight * tilegap * GetIdMap(i,j) , (i * tileWidth ) - xscroll , ((j - miny) * tileHeight) - yscroll, tileWidth , tileHeight); } } } diff --git a/src/Object.cpp b/src/Object.cpp index 399b152..632049f 100644 --- a/src/Object.cpp +++ b/src/Object.cpp @@ -99,8 +99,8 @@ bool Object::GetEnable() bool Object::IsOnScreen() { - /*if(OTransform->GetX() < Conteneur->GetScreen()->max.x && OTransform->GetX() + ORender->GetSizeX() > Conteneur->GetScreen()->min.x && OTransform->GetY() < Conteneur->GetScreen()->max.y && OTransform->GetY() + ORender->GetSizeY() > Conteneur->GetScreen()->min.y ) return true; - else return false;*/ + if(OTransform->GetX() < Conteneur->GetScreen()->max.x && OTransform->GetX() + ORender->GetSizeX() > Conteneur->GetScreen()->min.x && OTransform->GetY() < Conteneur->GetScreen()->max.y && OTransform->GetY() + ORender->GetSizeY() > Conteneur->GetScreen()->min.y ) return true; + else return false; return true; } @@ -113,7 +113,7 @@ Object * Object::GetObjectCollisionTag( char* v, int x , int y) { if(Conteneur->GetCurrentLevel()->GetListeObject()[i] != this) { - if(!strcmp(Conteneur->GetCurrentLevel()->GetListeObject()[i]->tag , v) && Conteneur->GetCurrentLevel()->GetListeObject()[i]->enable) + if( Conteneur->GetCurrentLevel()->GetListeObject()[i]->TestTag(v) && Conteneur->GetCurrentLevel()->GetListeObject()[i]->enable) { if(Collision(i , Conteneur->GetCurrentLevel()))return Conteneur->GetCurrentLevel()->GetListeObject()[i]; } @@ -126,7 +126,7 @@ Object * Object::GetObjectCollisionTag( char* v, int x , int y) { if(Conteneur->GetListeObject()[i] != this) { - if(!strcmp(Conteneur->GetListeObject()[i]->tag , v) && Conteneur->GetListeObject()[i]->enable) + if( Conteneur->GetCurrentLevel()->GetListeObject()[i]->TestTag(v) && Conteneur->GetListeObject()[i]->enable) { if(Collision(i))return Conteneur->GetListeObject()[i]; } @@ -184,5 +184,11 @@ bool Object::Collision(int id , Level * l) return false; } +bool Object::TestTag(char * v) +{ + if(!strcmp(tag , v)) + return true; + return false; +} diff --git a/src/Object/Animation.cpp b/src/Object/Animation.cpp index 2429e32..85e0dc6 100644 --- a/src/Object/Animation.cpp +++ b/src/Object/Animation.cpp @@ -49,8 +49,6 @@ Animation::Animation(Sprite * v , int nb , int nbd , bool vwaitatend , bool vwai iterateur = 0; time = 0; - waitatend = false; - waittheend = false; isend = false; } @@ -81,6 +79,15 @@ int Animation::GetBlitY() return TabSprite[iterateur].GetBlitY(); } +bool Animation::GetWaittheEnd() +{ + return waittheend; +} + +bool Animation::GetisEnd() +{ + return isend; +} void Animation::DrawAnim ( int x , int y , int d) { diff --git a/src/Object/Render.cpp b/src/Object/Render.cpp index 3dd239d..84b7633 100644 --- a/src/Object/Render.cpp +++ b/src/Object/Render.cpp @@ -65,7 +65,7 @@ void Render::CopieRender(Animation & v) 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; @@ -73,6 +73,13 @@ void Render::SetIt(int v) } } +void Render::ForceSetIt(int v) +{ + iterateur = v; + if( iterateur >= nb_anim) iterateur = 0; + TabAnim[ iterateur ].SetIt(0); +} + int Render::GetIt() { if(TabAnim)return iterateur; diff --git a/src/Object/Script.cpp b/src/Object/Script.cpp index 012359b..fdba05e 100644 --- a/src/Object/Script.cpp +++ b/src/Object/Script.cpp @@ -30,6 +30,13 @@ void Script::UpdateEverySecond() } +void Script::Teleport( int x , int y , int level ) +{ + GetEngine()->MoveObject(GetObject(),level); + GetEngine()->SetCurrentLevel(level); + GetObject()->GetTransform()->SetXY(x,y); +} + void Script::AffectObject(Object * OV) { OConteneur = OV; diff --git a/src/Trigger.cpp b/src/Trigger.cpp new file mode 100644 index 0000000..013d5aa --- /dev/null +++ b/src/Trigger.cpp @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* _____ _ __ ___ __ */ +/* Trigger.cpp | ___(_)/ _| ___ ( _ ) / /_ */ +/* Project: C-Engine | |_ | | |_ / _ \/ _ \| '_ \ */ +/* | _| | | _| __/ (_) | (_) | */ +/* Author: Fife |_| |_|_| \___|\___/ \___/ */ +/* */ +/* ************************************************************************** */ + +#include "..\C-Engine\include\Object.hpp" + +Trigger::Trigger() +{ + OTransform = new Transform(this); + ORender = new Render(this); + tag = new char[20]; + ORigidBody = new RigidBody(this); + + enable = true; + + Trigger_Script * Buffer = new Trigger_Script; + Buffer->AffectTrigger(this); + OScript = Buffer; + + Conteneur = NULL; +} + +Trigger::~Trigger() +{ + delete OTransform; + delete ORender; + delete ORigidBody; + delete OScript; + delete []tag; +} + +void Trigger::CreateTrigger(int x , int y , int width , int height ) +{ + OTransform->SetXY(x,y); + ORigidBody->UseFixeBody(width,height); +} + +void Trigger::SetDestination(int x , int y , int level) +{ + destination.x = x; + destination.y = y; + leveldestination = level; +} + +Vec2 Trigger::GetDestination() +{ + return destination; +} + +int Trigger::GetDestinationLevel() +{ + return leveldestination; +} + +void Trigger_Script::AffectTrigger(Trigger * TV) +{ + TConteneur = TV; + OConteneur = TV; + EConteneur = TConteneur->GetEngine(); +} + +Trigger * Trigger_Script::GetTrigger() +{ + return TConteneur; +} + +void Trigger_Script::Update() +{ + for(int i = 0 ; i < GetEngine()->GetCurrentLevel()->GetNbObject() ; i++ ) + { + if(GetEngine()->GetCurrentLevel()->GetListeObject()[i] != GetObject()) + { + if(GetObject()->Collision(i, GetEngine()->GetCurrentLevel())) + { + if(GetEngine()->GetCurrentLevel()->GetListeObject()[i]->GetScript()) + GetEngine()->GetCurrentLevel()->GetListeObject()[i]->GetScript()->Teleport(TConteneur->GetDestination().x , TConteneur->GetDestination().y , TConteneur->GetDestinationLevel()); + } + } + } +}