#include "Engine.h"
#include <windows.h>
Engine::Engine()
{
lastTick = 0;
wWidth = 800;
wHeight = 600;
wTitle = NULL;
screen = NULL;
FPSTickCounter = 0;
FPSCounter = 0;
currentFPS = 0;
isQuit = false;
isMinized = false;
}
Engine::~Engine()
{
SDL_Quit();
}
void Engine::setSize(const int &width, const int &height)
{
wWidth = width;
wHeight = height;
screen = SDL_SetVideoMode(wWidth, wHeight, 0, SDL_SWSURFACE);
}
void Engine::init()
{
// Register SDL_Quit for exit
atexit(SDL_Quit);
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
cout << "Cannot initial the SDL: " << SDL_GetError() << endl;
exit(1);;
}
setSize(wWidth, wHeight);
if (screen == NULL)
{
cout << "Unable to set up video: " << SDL_GetError() << endl;
exit(1);
}
additionalInit();
}
void Engine::start()
{
lastTick = SDL_GetTicks();
isQuit = false;
while(!isQuit)
{
handleInput();
if (isMinized)
WaitMessage();
else
{
doThink();
doRender();
}
}
end();
}
void Engine::handleInput()
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
{
isQuit = true;
break;
}
keyDown(event.key.keysym.sym);
break;
case SDL_KEYUP:
keyUp(event.key.keysym.sym);
break;
case SDL_QUIT:
isQuit = true;
break;
case SDL_MOUSEMOTION:
mouseMoved(event.button.button, event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONUP:
mouseButtonUp(event.button.button, event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONDOWN:
mouseButtonDown(event.button.button, event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
break;
case SDL_ACTIVEEVENT:
if(event.active.state & SDL_APPACTIVE)
{
if (event.active.gain)
{
isMinized = false;
windowActive();
}
else
{
isMinized = true;
windowInactive();
}
}
break;
}
}
}
void Engine::doThink()
{
long elapsedTicks = SDL_GetTicks() - lastTick;
lastTick = SDL_GetTicks();
think(elapsedTicks);
FPSTickCounter += elapsedTicks;
}
void Engine::doRender()
{
++FPSCounter;
if (FPSTickCounter >= 1000)
{
currentFPS = FPSCounter;
FPSCounter = 0;
FPSTickCounter = 0;
}
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
// Loack surface if needed
if (SDL_MUSTLOCK(screen))
if (SDL_LockSurface(screen) < 0)
{
cout << "Cannot lock the surface. " << endl;
return;
}
render(getSurface());
if (SDL_MUSTLOCK(screen))
SDL_UnlockSurface(screen);
SDL_Flip(screen);
}
void Engine::setTitle(const char *title)
{
wTitle = title;
SDL_WM_SetCaption(wTitle, 0);
}
const char* Engine::getTitle()
{
return wTitle;
}
SDL_Surface* Engine::getSurface()
{
return screen;
}
int Engine::getFPS()
{
return currentFPS;
}