/* ************************************************************************** */ /* _____ */ /* Engine.cpp | ___| _ ____ ___ */ /* Project : C-Engine | |_ | | | __| / _ \ */ /* | _| | | | |= | __/ */ /* By: Fife |_| |_| |_| \___| */ /* */ /* */ /* ************************************************************************** */ #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() ); } }