Beispiel #1
0
    void Game::Loop(void) {
        Logger::Log() << "Loop()";
        
        // Clock used in restricting Update loop to a fixed rate
        sf::Clock update_clock;
        update_clock.Reset();
        
        // Update immediately
        Uint32 next_update = update_clock.GetElapsedTime();
        
        // Loop while IsRunning returns true
        while(IsRunning() && window.IsOpened()) {
            
            IState* currentState = stateManager.GetActiveState();
            
            // Check for corrupt state returned by our StateManager
            assert(NULL != currentState && "Game::Loop() received a bad pointer");
            
            while (update_clock.GetElapsedTime() > next_update) {
             
                sf::Event event;

                while(window.PollEvent(event)) {
                    switch (event.Type) {
                        case sf::Event::Closed: // Window closed
                            Quit(EXIT_SUCCESS);
                            break;
                        case sf::Event::GainedFocus:  // Window gained focus
                            // resume state
                            currentState->Resume();
                            break;
                        case sf::Event::LostFocus:    // Window lost focus
                            // Pause state
                            currentState->Pause();
                            break;
                        case sf::Event::Resized:      // Window resized
                            break;
                        default:
                            // Allow state to handle events
                            currentState->HandleEvents(event);
                            break;
                    }
                    
                }

                // Update current state
                currentState->UpdateFixed();

                next_update += update_rate;
            }
            
            // Draw current state
            currentState->Draw();

            window.Display();
            
            // Cleanup state
        }
        
    }