diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-08-18 21:08:20 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-08-18 21:08:20 (GMT) |
| commit | 740f0d30c3d5badc10da09af875b47d67128048b (patch) | |
| tree | 2c9ce272c8a9afb75c55ef5a3d73973143cd89a8 /src/PowderToySDL.cpp | |
| parent | 63da7a4afec50035c6aa37a29a8d60d38cab969f (diff) | |
| download | powder-740f0d30c3d5badc10da09af875b47d67128048b.zip powder-740f0d30c3d5badc10da09af875b47d67128048b.tar.gz | |
Blocking Confirm/Error/Input prompts (EngineProcess creates a new event loop which can be broken out of with Engine::Break())
Diffstat (limited to 'src/PowderToySDL.cpp')
| -rw-r--r-- | src/PowderToySDL.cpp | 257 |
1 files changed, 135 insertions, 122 deletions
diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 0a331f5..9d1aa15 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -284,11 +284,140 @@ std::map<std::string, std::string> readArguments(int argc, char * argv[]) return arguments; } +int elapsedTime = 0, currentTime = 0, lastTime = 0, currentFrame = 0; +unsigned int lastTick = 0; +float fps = 0, delta = 1.0f, inputScale = 1.0f; +ui::Engine * engine = NULL; + +void EngineProcess() +{ + SDL_Event event; + while(engine->Running()) + { + if(engine->Broken()) + { + engine->Break(); + break; + } + event.type = 0; + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + engine->Exit(); + break; + case SDL_KEYDOWN: + engine->onKeyPress(event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.mod&KEY_MOD_LSHIFT, event.key.keysym.mod&KEY_MOD_LCONTROL, event.key.keysym.mod&KEY_MOD_LALT); + break; + case SDL_KEYUP: + engine->onKeyRelease(event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.mod&KEY_MOD_LSHIFT, event.key.keysym.mod&KEY_MOD_LCONTROL, event.key.keysym.mod&KEY_MOD_LALT); + break; + case SDL_MOUSEMOTION: + engine->onMouseMove(event.motion.x*inputScale, event.motion.y*inputScale); + break; + case SDL_MOUSEBUTTONDOWN: + if(event.button.button == SDL_BUTTON_WHEELUP) + { + engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, 1); + } + else if (event.button.button == SDL_BUTTON_WHEELDOWN) + { + engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, -1); + } + else + { + engine->onMouseClick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button); + } + break; + case SDL_MOUSEBUTTONUP: + if(event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN) + engine->onMouseUnclick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button); + break; +#ifdef OGLI + case SDL_VIDEORESIZE: + float ratio = float(XRES+BARSIZE) / float(YRES+MENUSIZE); + float width = event.resize.w; + float height = width/ratio; + + sdl_scrn = SDL_SetVideoMode(event.resize.w, height, 32, SDL_OPENGL | SDL_RESIZABLE); + + glViewport(0, 0, width, height); + engine->g->Reset(); + //glScaled(width/currentWidth, height/currentHeight, 1.0f); + + currentWidth = width; + currentHeight = height; + inputScale = float(XRES+BARSIZE)/currentWidth; + + glLineWidth(currentWidth/float(XRES+BARSIZE)); + if(sdl_scrn == NULL) + { + std::cerr << "Oh bugger" << std::endl; + } + break; +#endif + } + event.type = 0; //Clear last event + } + + engine->Tick(); + engine->Draw(); + + if(SDL_GetTicks()-lastTick>250) + { + //Run client tick every second + lastTick = SDL_GetTicks(); + Client::Ref().Tick(); + } + + if(scale != engine->Scale || fullscreen != engine->Fullscreen) + { + sdl_scrn = SDLSetScreen(engine->Scale, engine->Fullscreen); + inputScale = 1.0f/float(scale); + } + +#ifdef OGLI + blit(); +#else + if(engine->Scale==2) + blit2(engine->g->vid, engine->Scale); + else + blit(engine->g->vid); +#endif + + currentFrame++; + currentTime = SDL_GetTicks(); + elapsedTime = currentTime - lastTime; + if(ui::Engine::Ref().FpsLimit > 2.0f && (currentFrame>2 || elapsedTime > 1000*2/ui::Engine::Ref().FpsLimit) && elapsedTime && currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit) + { + while (currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit) + { + SDL_Delay(1); + currentTime = SDL_GetTicks(); + elapsedTime = currentTime-lastTime; + } + } + if(elapsedTime>=1000) + { + fps = (((float)currentFrame)/((float)elapsedTime))*1000.0f; + currentFrame = 0; + lastTime = currentTime; + if(ui::Engine::Ref().FpsLimit > 2.0f) + { + delta = ui::Engine::Ref().FpsLimit/fps; + } + else + { + delta = 1.0f; + } + } + engine->SetFps(fps); + } +} + int main(int argc, char * argv[]) { - int elapsedTime = 0, currentTime = 0, lastTime = 0, currentFrame = 0; - unsigned int lastTick = 0; - float fps = 0, delta = 1.0f, inputScale = 1.0f; float currentWidth = XRES+BARSIZE, currentHeight = YRES+MENUSIZE; std::map<std::string, std::string> arguments = readArguments(argc, argv); @@ -362,7 +491,7 @@ int main(int argc, char * argv[]) inputScale = 1.0f/float(scale); ui::Engine::Ref().Fullscreen = fullscreen; - ui::Engine * engine = &ui::Engine::Ref(); + engine = &ui::Engine::Ref(); engine->Begin(XRES+BARSIZE, YRES+MENUSIZE); GameController * gameController = new GameController(); @@ -463,124 +592,8 @@ int main(int argc, char * argv[]) } } - SDL_Event event; - while(engine->Running()) - { - event.type = 0; - while (SDL_PollEvent(&event)) - { - switch (event.type) - { - case SDL_QUIT: - engine->Exit(); - break; - case SDL_KEYDOWN: - engine->onKeyPress(event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.mod&KEY_MOD_LSHIFT, event.key.keysym.mod&KEY_MOD_LCONTROL, event.key.keysym.mod&KEY_MOD_LALT); - break; - case SDL_KEYUP: - engine->onKeyRelease(event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.mod&KEY_MOD_LSHIFT, event.key.keysym.mod&KEY_MOD_LCONTROL, event.key.keysym.mod&KEY_MOD_LALT); - break; - case SDL_MOUSEMOTION: - engine->onMouseMove(event.motion.x*inputScale, event.motion.y*inputScale); - break; - case SDL_MOUSEBUTTONDOWN: - if(event.button.button == SDL_BUTTON_WHEELUP) - { - engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, 1); - } - else if (event.button.button == SDL_BUTTON_WHEELDOWN) - { - engine->onMouseWheel(event.motion.x*inputScale, event.motion.y*inputScale, -1); - } - else - { - engine->onMouseClick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button); - } - break; - case SDL_MOUSEBUTTONUP: - if(event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN) - engine->onMouseUnclick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button); - break; -#ifdef OGLI - case SDL_VIDEORESIZE: - float ratio = float(XRES+BARSIZE) / float(YRES+MENUSIZE); - float width = event.resize.w; - float height = width/ratio; - - sdl_scrn = SDL_SetVideoMode(event.resize.w, height, 32, SDL_OPENGL | SDL_RESIZABLE); - - glViewport(0, 0, width, height); - engine->g->Reset(); - //glScaled(width/currentWidth, height/currentHeight, 1.0f); - - currentWidth = width; - currentHeight = height; - inputScale = float(XRES+BARSIZE)/currentWidth; - - glLineWidth(currentWidth/float(XRES+BARSIZE)); - if(sdl_scrn == NULL) - { - std::cerr << "Oh bugger" << std::endl; - } - break; -#endif - } - event.type = 0; //Clear last event - } - - engine->Tick(); - engine->Draw(); - - if(SDL_GetTicks()-lastTick>250) - { - //Run client tick every second - lastTick = SDL_GetTicks(); - Client::Ref().Tick(); - } - - if(scale != engine->Scale || fullscreen != engine->Fullscreen) - { - sdl_scrn = SDLSetScreen(engine->Scale, engine->Fullscreen); - inputScale = 1.0f/float(scale); - } - -#ifdef OGLI - blit(); -#else - if(engine->Scale==2) - blit2(engine->g->vid, engine->Scale); - else - blit(engine->g->vid); -#endif - - currentFrame++; - currentTime = SDL_GetTicks(); - elapsedTime = currentTime - lastTime; - if(ui::Engine::Ref().FpsLimit > 2.0f && (currentFrame>2 || elapsedTime > 1000*2/ui::Engine::Ref().FpsLimit) && elapsedTime && currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit) - { - while (currentFrame*1000/elapsedTime > ui::Engine::Ref().FpsLimit) - { - SDL_Delay(1); - currentTime = SDL_GetTicks(); - elapsedTime = currentTime-lastTime; - } - } - if(elapsedTime>=1000) - { - fps = (((float)currentFrame)/((float)elapsedTime))*1000.0f; - currentFrame = 0; - lastTime = currentTime; - if(ui::Engine::Ref().FpsLimit > 2.0f) - { - delta = ui::Engine::Ref().FpsLimit/fps; - } - else - { - delta = 1.0f; - } - } - engine->SetFps(fps); - } + EngineProcess(); + ui::Engine::Ref().CloseWindow(); delete gameController; delete ui::Engine::Ref().g; |
