00001 #include "Game.h"
00002 #include "Parser.h"
00003 #include "List.h"
00004 #include "Control.h"
00005 #include "Player.h"
00006
00007 using namespace std;
00008
00009 Game::Game(int levelnum)
00010 :_currentLevel( NULL )
00011 {
00012
00013
00014
00015
00016
00017
00018 List* levelList = Parser::parse( "levels/levellist.txt" );
00019 while( !levelList->empty() )
00020 {
00021 _levelList.push( levelList->firstList()->firstString() );
00022 levelList = levelList->rest();
00023 }
00024
00025
00026 for(int i=0; i<levelnum; i++)
00027 _levelList.pop();
00028
00029
00030 loadLevel( _levelList.front() );
00031 }
00032
00033 Game::~Game()
00034 {
00035 delete _currentLevel;
00036 }
00037
00038 bool Game::nextLevel()
00039 {
00040 _levelList.pop();
00041 if( _levelList.empty() )
00042 {
00043 cerr << "Error loading level: No next level" << endl;
00044 return false;
00045 }
00046
00047
00048
00049
00050
00051
00052 delete _currentLevel;
00053 _currentLevel = new Level();
00054 _currentLevel->levelLoad( _levelList.front());
00055 return true;
00056 }
00057
00058 void Game::loadLevel( std::string filename )
00059 {
00060 if(!_currentLevel)
00061 delete _currentLevel;
00062 _currentLevel = new Level();
00063 _currentLevel->levelLoad( filename );
00064 }
00065
00066
00067
00068
00069
00070
00071 bool Game::mainLoop()
00072 {
00073 SDL_Event event;
00074 Screen* screen = Screen::instance();
00075 glfuncs* f = glfuncs::instance();
00076 bool leave = false;
00077 int ticks = SDL_GetTicks();
00078 for(;;){
00079 while(!leave)
00080 {
00081
00082 f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00083
00084
00085
00086 while((SDL_GetTicks() - ticks) < 1000/Screen::FRAMERATE)
00087 {
00088
00089 Sleep(0);
00090 }
00091
00092
00093 if(!_currentLevel->update())
00094 return true;
00095
00096 _currentLevel->draw();
00097
00098
00099 ticks = SDL_GetTicks();
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 Screen::drawScramble();
00110
00111
00112 f->glFinish();
00113 SDL_GL_SwapBuffers();
00114
00115
00116 while(SDL_PollEvent(&event))
00117 {
00118 if(event.type == SDL_KEYDOWN){
00119 if( event.key.keysym.sym == Control::quitKey)
00120 leave = true;
00121 }
00122
00123 else if( event.type == SDL_QUIT )
00124 {
00125 return false;
00126 }
00127 }
00128 }
00129
00130 f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00131
00132 while((SDL_GetTicks() - ticks) < 1000/Screen::FRAMERATE)
00133 {
00134
00135 Sleep(0);
00136 }
00137 ticks = SDL_GetTicks();
00138
00139 Screen::drawPause();
00140
00141 Screen::drawScramble();
00142
00143
00144 f->glFinish();
00145 SDL_GL_SwapBuffers();
00146
00147
00148 while(SDL_PollEvent(&event))
00149 {
00150 if(event.type == SDL_KEYDOWN){
00151 if( event.key.keysym.sym == Control::quitKey)
00152 leave = false;
00153 if( event.key.keysym.sym == Control::selectKey)
00154 return false;
00155 }
00156
00157 else if( event.type == SDL_QUIT )
00158 {
00159 return false;
00160 }
00161 }
00162 }
00163 }