因此,我正在尝试使用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();
}
我已经将您的代码修改为可以编译并实际在屏幕上绘制内容的代码。这不是您希望的外观,而是通过两个视图都可以显示工程图。您应该可以尝试进行此操作。
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;
}