C-Engine/src/Engine.cpp

197 lines
4.8 KiB
C++

/* ************************************************************************** */
/* _____ */
/* Engine.cpp | ___| _ ____ ___ */
/* Project : C-Engine | |_ | | | __| / _ \ */
/* | _| | | | |= | __/ */
/* By: Fife <wasabifife@gmail.com> |_| |_| |_| \___| */
/* */
/* */
/* ************************************************************************** */
#include "..\Rework\include\Engine.hpp"
Engine::Engine()
{
execute = true;
fps = false;
fpswish = 4;
listeObject = NULL;
nbobject = 0;
}
void Engine::StartGame()
{
InitGame();
while(execute)
{
ML_clear_vram();
input_update();
ExecuteScript();
AppliedForce();
UpdateRelativePosition();
Draw();
setFps(fpswish);
ML_display_vram();
}
DelAllObject();
}
void Engine::InitGame()
{
execute = true;
srand(RTC_getTicks());
for( int i = 0 ; i < nbobject ; i++ )
{
if(listeObject[i]->GetScript() && listeObject[i]->GetEnable())listeObject[i]->GetScript()->Start();
}
}
void Engine::StopGame()
{
execute = false;
}
void Engine::ShowFps()
{
fps = true;
}
void Engine::HideFps()
{
fps = false;
}
void Engine::SetFpsWish(int v)
{
fpswish = 180 / v;
}
void Engine::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(this);
nbobject ++;
delete Tab;
}
void Engine::DelObject( Object * v)
{
Object ** Tab = listeObject;
int index = -1;
if(!Tab)return;
for( int i = 0 ; i < nbobject ; i++ )
if(Tab[i] == v )
index = i ;
if(index == -1)return;
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;
}
void Engine::DelAllObject()
{
for(int i = 0 ; i < nbobject ; i++)
delete listeObject[i];
delete listeObject;
listeObject = NULL;
}
Object ** Engine::GetListeObject()
{
return listeObject;
}
int Engine::GetNbObject()
{
return nbobject;
}
void Engine::ExecuteScript()
{
for( int i = 0 ; i < nbobject ; i++ )
{
if( listeObject[i]->GetEnable())
if(listeObject[i]->GetScript())
listeObject[i]->GetScript()->Update();
}
}
void Engine::AppliedForce()
{
for( int i = 0 ; i < nbobject ; i++ )
{
if( listeObject[i]->GetEnable())
if(listeObject[i]->GetRigidBody())
listeObject[i]->GetRigidBody()->AppliedForce();
}
}
void Engine::Draw()
{
for( int i = 0 ; i < nbobject ; i++ )
{
if( listeObject[i]->GetEnable())
if(listeObject[i]->GetRender())
listeObject[i]->GetRender()->DrawObject();
}
if(fps)
PrintV(110,2,getFps());
}
/*
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;
}
*/
void Engine::UpdateRelativePosition()
{
for( int i = 0 ; i < nbobject; i++ )
{
if(listeObject[i]->GetEnable())
listeObject[i]->GetTransform()->SetRelativeXY( listeObject[i]->GetTransform()->GetX() , listeObject[i]->GetTransform()->GetY() );
}
}