Представления SFML против путаницы окон - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть этот единственный код C ++ / SFML ...

#include <SFML/Graphics.hpp>

#define windowWidth  600
#define windowHeight 300

int main()
{
   sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML Views");

   sf::View view(sf::FloatRect(0,0, windowWidth, windowHeight));
   view.zoom(2);
   window.setView(view);


   sf::RectangleShape back (sf::Vector2f(windowWidth, windowHeight));
   back.setFillColor(sf::Color::White);

   sf::RectangleShape rect (sf::Vector2f(200, 100));
   rect.setFillColor(sf::Color::Red);
   rect.setPosition(windowWidth - rect.getSize().x, windowHeight - rect.getSize().y); // position in the lower right corner

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(back);
        window.draw(rect);
        window.display();
    }

    return 0;
}

... который может расположить красный прямоугольник в правом нижнем углу окна.

Однако, когда я увеличиваю изображение (как в коде), оно, очевидно, перемещается вместе со всем окном, как это изображение . У меня есть некоторые сомнения:

  1. Чтобы исправить положение красного прямоугольника и поместить его в нижний правый угол глобального окна, мне в настоящее время необходимо выполнить некоторые вычисления с учетом коэффициента масштабирования, размера исходного прямоугольника и т. Д. Есть ли более простой способ позиционирования этого прямоугольник в правом нижнем углу глобального окна?
  2. Как предотвратить изменение размеров некоторых объектов за счет увеличения вида?
  3. Что мне нужно сделать, чтобы в одном окне было несколько активных видов?

1 Ответ

0 голосов
/ 25 апреля 2018

Есть ли более простой способ расположить этот прямоугольник в правом нижнем углу глобального окна?

Из Учебное пособие по 2D-камере SFML : «Чтобы нарисовать что-либо, используя вид, вы должны нарисовать его после вызова функции setView цели, в которую вы рисуете» *

То есть чертежная часть должна быть

window.clear();
window.setView(view);
window.draw(back);
window.setView(window.getDefaultView()); //don't zoom red rect
window.draw(rect);
window.display();

Что мне нужно сделать, чтобы в одном окне было несколько активных видов?

Просто позвоните setView() для каждого активного вида и затем отрисовайте все вещи в этом виде (снова, если необходимо)

window.setView(leftHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(rightHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(minimap);
window.draw(a);
window.draw(b);
window.setView(window.getDefaultView());
window.draw(x);
window.draw(y);
...