Files
commandergenius/project/jni/application/gav/gav-0.9.0/automa/AutomaMainLoop.cpp
2010-11-12 13:32:08 +02:00

114 lines
2.6 KiB
C++

/* -*- C++ -*- */
/*
GAV - Gpl Arcade Volleyball
Copyright (C) 2002
GAV team (http://sourceforge.net/projects/gav/)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <SDL.h>
#include "AutomaMainLoop.h"
#include "InputState.h"
#include "globals.h"
#include "StateMenu.h"
#include "StatePlaying.h"
#include "MenuItemFullScreen.h"
#ifndef NONET
#include "StateClient.h"
#endif
AutomaMainLoop::AutomaMainLoop()
{
_is = new InputState();
StateMenu *sm = new StateMenu();
addState(STATE_MENU, sm);
_curr = STATE_MENU;
StatePlaying *sp = new StatePlaying();
addState(STATE_PLAYING, sp);
#ifndef NONET
StateClient *sc = new StateClient();
addState(STATE_CLIENT, sc);
#endif
_prev = -1;
}
int AutomaMainLoop::transition(int retval)
{
if ( retval == NO_TRANSITION )
return(_curr);
#if 0
switch ( _curr ) {
case STATE_MENU:
return STATE_PLAYING;
break;
case STATE_PLAYING:
return STATE_MENU;
break;
#ifndef NONET
case STATE_CLIENT:
return STATE_MENU;
break;
#endif
}
#endif
return retval; // _curr;
}
int AutomaMainLoop::start()
{
unsigned int prevTicks = 0;
// unsigned int prevDrawn = 0;
unsigned int frames = 0;
unsigned int milliseconds;
while ( 1 ) {
int ticks = SDL_GetTicks();
if ( prevTicks == 0 ) {
prevTicks = ticks;
continue;
}
frames++;
milliseconds += ticks - prevTicks;
if ( milliseconds >= 1000 )
frames = milliseconds = 0;
_is->getInput();
if ( _is->getF()[9] ) {
std::stack<Menu *> s;
MenuItemFullScreen().execute(s);
}
// execute the _curr state's code, and transact
int retval = _states[_curr]->execute(_is,
ticks, prevTicks,
(_prev != _curr));
_prev = _curr;
_curr = transition(retval);
if ( (ticks - prevTicks) < configuration.mill_per_frame )
SDL_Delay(configuration.mill_per_frame - (ticks - prevTicks));
prevTicks = ticks;
}
return(0);
}