1. ホーム
  2. c++

[解決済み] SFML ビューとウィンドウの混同

2022-02-16 10:33:33

質問

c++ / SFMLのコードを1つだけ持っています。

#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. 同じウィンドウに複数のアクティブビューを表示するにはどうすればよいですか?

解決方法は?

<ブロッククオート

この矩形をグローバルウィンドウの右下隅に配置する簡単な方法はありますか?

から SFML 2Dカメラチュートリアル : "ビューを使って何かを描くには、描画対象の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);