制作sfml c ++滚动条不会在veiw内绘制形状

问题描述 投票:0回答:1

因此,我正在尝试使用sfml制作基本的GUI,并且需要滚动条来滚动可绘制对象的循环。经过研究,我了解到视图操纵将是实现它的方法。我有一个要用作视图的轮廓的矩形,并且设置了条形图本身,我只需要它即可更改视图。我的问题是我没有在视图中画任何东西。如果它不会在视图中绘制任何内容,则很难滚动查看。感谢所有帮助,谢谢。

我的放纵

    projectsBox = sf::RectangleShape(sf::Vector2f((400 * scale) - (2 * (10 * scale)), 225 * scale));
    projectsBox.setOrigin(sf::Vector2f(-10 * scale, -130 * scale));
    projectsBox.setOutlineColor(sf::Color::Black);
    projectsBox.setOutlineThickness(10 * scale);
    projectsBox.setFillColor(sf::Color::Transparent);
    projectsVeiw.setViewport(projectsBox.getGlobalBounds());

void sfmlWindow::drawProjects() {
    sf::CircleShape base;
    base.setRadius(30);
    base.setScale(0, userProjects->projects[1].name.length());
    base.setFillColor(sf::Color::Blue/*sf::Color(33, 33, 33, 270)*/);
    base.setOrigin(0, 0);
    sf::Text text;
    textInit(&text, userProjects->projects[1].name, 96);
    text.setOrigin(0, 0);
    projectsDrawables.emplace_back(std::make_unique<sf::CircleShape>(base));
    projectsDrawables.emplace_back(std::make_unique<sf::Text>(text));
}

我的循环

        while (mainWindow.isOpen()) {
            eventLoop();

            mainWindow.clear(sf::Color::Transparent);

            //Do project veiw
            mainWindow.setView(projectsVeiw);
            drawProjects();
            for (std::unique_ptr<sf::Drawable>& i : projectsDrawables) {
                mainWindow.draw(*i);
            }

            //draw drawbles
            mainWindow.setView(mainWindow.getDefaultView());
            for (std::unique_ptr<sf::Drawable>& i : allDrawables) {
                mainWindow.draw(*i);
            }
            mainWindow.draw(projectsBox);
            projectsSlider.setSize(sf::Vector2f(15, slidersize()));
            mainWindow.draw(projectsSlider);

            //render
            mainWindow.display();
        }
c++ sfml
1个回答
0
投票

我已经将您的代码修改为可以编译并实际在屏幕上绘制内容的代码。这不是您希望的外观,而是通过两个视图都可以显示工程图。您应该可以尝试进行此操作。

std::vector<std::unique_ptr<sf::Drawable> > projectsDrawables;
std::vector<std::unique_ptr<sf::Drawable> > allDrawables;

sf::Font font;

void drawProjects() {
   sf::CircleShape base;
   base.setRadius(30);
   base.setFillColor(sf::Color::Blue);
   base.setPosition(1000, 1000);

   sf::Text text;
   text.setFont(font);
   text.setFillColor(sf::Color::White);
   text.setString("hello");
   text.setCharacterSize(96);
   text.setOrigin(1100, 1000);

   projectsDrawables.emplace_back(std::make_unique<sf::Text>(text));
   projectsDrawables.emplace_back(std::make_unique<sf::CircleShape>(base));


   sf::CircleShape base2;
   base2.setRadius(50);
   base2.setFillColor(sf::Color::Red);
   base2.setPosition(30, 80);

   sf::Text text2;
   text2.setFont(font);
   text2.setFillColor(sf::Color::Green);
   text2.setString("Cheese");
   text2.setCharacterSize(48);
   text2.setPosition(30, 30);

   allDrawables.emplace_back(std::make_unique<sf::Text>(text2));
   allDrawables.emplace_back(std::make_unique<sf::CircleShape>(base2));
}


int main()
{
   sf::RenderWindow mainWindow(sf::VideoMode((2+BOARD_SIZE) * (int)TILE_SIZE, (2+BOARD_SIZE) * (int)TILE_SIZE), "Snake");

   if (!font.loadFromFile("Instruction.ttf") ) {
      std::cerr << "Font error." << std::endl;
      exit( -1 );
   }
   sf::Clock clock;

   auto scale = 1;
   auto projectsBox = sf::RectangleShape(sf::Vector2f(400, 225));
   projectsBox.setPosition(1000,1000);
   projectsBox.setOutlineColor(sf::Color::Green);
   projectsBox.setOutlineThickness(10 * scale);
   projectsBox.setFillColor(sf::Color::Transparent);
   sf::View projectsView( projectsBox.getGlobalBounds());

   while (mainWindow.isOpen()) {
      sf::Time elapsed = clock.getElapsedTime();
      if (elapsed.asSeconds() > 0.2f) {
         clock.restart();
      }

      sf::Event event;
      while (mainWindow.pollEvent(event)) {
         if (event.type == sf::Event::Closed)
            mainWindow.close();
         // Respond to key pressed events
         if (event.type == sf::Event::KeyPressed){
            if (event.key.code == sf::Keyboard::Escape){
               return 0;
            }
         }
      }

      mainWindow.clear(sf::Color::Black);

      mainWindow.setView(projectsView);
      mainWindow.draw(projectsBox);

      //Do project veiw
      drawProjects();
      for (std::unique_ptr<sf::Drawable>& i : projectsDrawables) {
         mainWindow.draw(*i);
      }

      //draw drawbles
      mainWindow.setView(mainWindow.getDefaultView());
      for (std::unique_ptr<sf::Drawable>& i : allDrawables) {
         mainWindow.draw(*i);
      }
      //projectsSlider.setSize(sf::Vector2f(15, slidersize()));
      //mainWindow.draw(projectsSlider);

      //render
      mainWindow.display();


   }

   return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.