void StarkEngine::mainLoop() { while (!shouldQuit()) { _frameLimiter->startFrame(); processEvents(); if (_userInterface->shouldExit()) { quitGame(); break; } if (_userInterface->hasQuitToMainMenuRequest()) { _userInterface->performQuitToMainMenu(); } if (_resourceProvider->hasLocationChangeRequest()) { _global->setNormalSpeed(); _resourceProvider->performLocationChange(); } updateDisplayScene(); // Swap buffers _frameLimiter->delayBeforeSwap(); _gfx->flipBuffer(); } }
void StarkEngine::mainLoop() { // Load the initial scene _scene = new Scene(_gfx); while (!shouldQuit()) { // Process events Common::Event e; while (g_system->getEventManager()->pollEvent(e)) { // Handle any buttons, keys and joystick operations if (e.type == Common::EVENT_KEYDOWN) { if (e.kbd.ascii == 'q') { quitGame(); break; } else { //handleChars(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); } } /*if (event.type == Common::EVENT_KEYDOWN || event.type == Common::EVENT_KEYUP) { handleControls(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); }*/ // Check for "Hard" quit" //if (e.type == Common::EVENT_QUIT) // return; /*if (event.type == Common::EVENT_SCREEN_CHANGED) _refreshDrawNeeded = true;*/ } updateDisplayScene(); g_system->delayMillis(50); } }
void GrimEngine::playAspyrLogo() { // A trimmed down version of the code found in mainloop // for the purpose of playing the Aspyr-logo. // The reason for this, is that the logo needs a different // codec than all the other videos (which are Bink). // Code is provided to keep within the fps-limit, as well as to // allow for pressing ESC to skip the movie. MoviePlayer *defaultPlayer = g_movie; g_movie = CreateQuickTimePlayer(); g_movie->play("AMWI.m4b", false, 0, 0); setMode(SmushMode); while (g_movie->isPlaying()) { _doFlip = true; uint32 startTime = g_system->getMillis(); updateDisplayScene(); if (_doFlip) { doFlip(); } // Process events to allow the user to skip the logo. Common::Event event; while (g_system->getEventManager()->pollEvent(event)) { // Ignore everything but ESC when movies are playing Common::EventType type = event.type; if (type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) { g_movie->stop(); break; } } uint32 endTime = g_system->getMillis(); if (startTime > endTime) continue; uint32 diffTime = endTime - startTime; if (_speedLimitMs == 0) continue; if (diffTime < _speedLimitMs) { uint32 delayTime = _speedLimitMs - diffTime; g_system->delayMillis(delayTime); } } delete g_movie; setMode(NormalMode); g_movie = defaultPlayer; }
void GrimEngine::mainLoop() { _movieTime = 0; _frameTime = 0; _frameStart = g_system->getMillis(); _frameCounter = 0; _timeAccum = 0; _frameTimeCollection = 0; _prevSmushFrame = 0; _savegameLoadRequest = false; _savegameSaveRequest = false; _savegameFileName = NULL; _refreshShadowMask = false; for (;;) { uint32 startTime = g_system->getMillis(); if (_savegameLoadRequest) { savegameRestore(); } if (_savegameSaveRequest) { savegameSave(); } g_imuse->flushTracks(); g_imuse->refreshScripts(); if (_mode == ENGINE_MODE_IDLE) { // don't kill CPU g_system->delayMillis(10); continue; } // Process events Common::Event event; while (g_system->getEventManager()->pollEvent(event)) { // Handle any buttons, keys and joystick operations if (event.type == Common::EVENT_KEYDOWN) { if (_mode != ENGINE_MODE_DRAW && _mode != ENGINE_MODE_SMUSH && (event.kbd.ascii == 'q')) { handleExit(); break; } else { handleChars(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); } } if (event.type == Common::EVENT_KEYDOWN || event.type == Common::EVENT_KEYUP) { handleControls(event.type, event.kbd.keycode, event.kbd.flags, event.kbd.ascii); } // Check for "Hard" quit" if (event.type == Common::EVENT_QUIT) return; if (event.type == Common::EVENT_SCREEN_CHANGED) _refreshDrawNeeded = true; } luaUpdate(); if (_mode != ENGINE_MODE_PAUSE) { updateDisplayScene(); doFlip(); } if (g_imuseState != -1) { g_imuse->setMusicState(g_imuseState); g_imuseState = -1; } uint32 endTime = g_system->getMillis(); if (startTime > endTime) continue; uint32 diffTime = endTime - startTime; if (_speedLimitMs == 0) continue; if (diffTime < _speedLimitMs) { uint32 delayTime = _speedLimitMs - diffTime; g_system->delayMillis(delayTime); } } }