Scene/Viewport(Iframe) Units
GitHub 版はこちらから
説明
ユーザー定義リテラルで、数値に対して使うことが出来ます。
100 が元となるサイズと等しくなります。(つまりパーセント表示をしている。)
_sw/_sh
SceneのScene::Width/Scene::Heightを 100 としたサイズを返します
_vw/_vh
Iframe とシザー矩形 に登場するIframe::Width/Iframe::Heightを 100 としたサイズを返します。 サンプル概要
昔の Windows みたいな配色の Microsoft っぽいロゴ
ウィンドウのサイズを変更してみても、変な余白等は出来ないのが確認できます。
こんな感じ:
https://scrapbox.io/files/64f5ac2c38c918001bf4cb9f.png
code: svwh.cpp
#include <Siv3D.hpp> // OpenSiv3D v0.6.11 double per(const double source, const double per) noexcept
{
return per * 0.01 * source;
}
double vw(const double p) noexcept
{
//return per(Iframe::Width(), p);
return per(Graphics2D::GetViewport().value_or(Scene::Rect()).w, p);
}
double vh(const double p) noexcept
{
//return per(Iframe::Height(), p);
return per(Graphics2D::GetViewport().value_or(Scene::Rect()).h, p);
}
double sw(const double p) noexcept
{
return per(Scene::Width(), p);
}
double sh(const double p) noexcept
{
return per(Scene::Height(), p);
}
inline namespace literals
{
double operator""_vw(const unsigned long long per) noexcept
{
return vw((double)per);
}
double operator""_vw(const long double per) noexcept
{
return vw((double)per);
}
double operator""_vh(const unsigned long long per) noexcept
{
return vh((double)per);
}
double operator""_vh(const long double per) noexcept
{
return vh((double)per);
}
double operator""_sw(const unsigned long long per) noexcept
{
return sw((double)per);
}
double operator""_sw(const long double per) noexcept
{
return sw((double)per);
}
double operator""_sh(const unsigned long long per) noexcept
{
return sh((double)per);
}
double operator""_sh(const long double per) noexcept
{
return sh((double)per);
}
} // namespace literals
void Main()
{
Window::Resize(1'000, 1'000, Centering::Yes);
Window::SetStyle(WindowStyle::Sizable);
//Scene::SetResizeMode(ResizeMode::Actual);
Scene::SetBackground(Color(U"#B8C9CD"));
while (System::Update())
{
// _vw/_vh は、Viewport(Iframe) が設定されていない場合は _sw/_sh と同じ値を返す
// top left
RectF({5_vw, 5_vh}, {42.5_vw, 42.5_vh}).draw(Palette::Red);
// top right
RectF({52.5_vw, 5_vh}, {42.5_vw, 42.5_vh}).draw(Palette::Green);
// bottom right
RectF({52.5_vw, 52.5_vh}, {42.5_vw, 42.5_vh}).draw(Palette::Yellow);
// bottom left
RectF({5_vw, 52.5_vh}, {42.5_vw, 42.5_vh}).draw(Palette::Blue);
}
}