Ejemplo n.º 1
0
int Game::run()
{
    using namespace std::placeholders;

    if ( m_glfw == false ) {
        std::cerr << "Can't initialize GLFW" << std::endl;
        return 1;
    }

    try {
        Timer timer;
        Render render;
        Font font( m_config.fontSize );
        Window window( m_config.windowWidth, m_config.windowHeight );

        window.setClickHandler( std::bind( & Game::onWindowClick, this, _1, _2, _3 ) );
        resetTarget();

        for ( short frame = 0; window.shouldClose() == false; ++ frame ) {
            //! Двигаем цель
            m_target->move();

            //! Проверяем выход за видимые границы
            if ( m_target->inBounds() == false ) {
                resetTarget();
            }

            //! Проверяем переполнении счетчика кадров
            if ( frame < 0 ) {
                frame = 0;
                timer.reset();
            }

            //! Определяем размер области для рисования
            auto size = std::make_pair( 0, 0 );
            window.readViewportSize( size.first, size.second );

            //! FPS = frame * 10^6 / microseconds
            const auto score = std::to_string( m_score );
            const auto fps = std::to_string( int ( 1000000.0 * frame / timer.getDuration() ) );

            //! Рисуем игровые объекты
            render.begin( size.first, size.second );
            render.useColor( m_target->getColor().red, m_target->getColor().green, m_target->getColor().blue );
            render.drawDisk( m_target->getX(), m_target->getY(), m_target->getRadius(), m_config.diskQuality );
            render.useColor( 1.0, 1.0, 1.0 );
            render.drawText( -0.9, -0.9, font, score );
            render.drawText( 0.9 - fps.length() * font.getSize(), -0.9, font, fps );
            render.end();

            //! Обновляем окно
            window.update();
        }

    } catch ( std::exception & exception ) {
        std::cerr << exception.what() << std::endl;
        return 1;
    }

    return 0;
}