画像のアンカーポイントについて
Reputeless 2017/05/24(Wed) 17:20
draw() では左上が、drawAt() では画像の中心がアンカーポイントになります。ほかの場所に設定する場合はラッパークラスを作る必要があります。実装例を以下に示します。
# include <Siv3D.hpp>
class AnchoredTexture
{
private:
Texture m_texture;
Vec2 m_anchorPoint = Vec2(0, 0);
public:
AnchoredTexture() = default;
explicit AnchoredTexture(const FilePath& path, const Optional<Vec2>& anchorPoint = unspecified)
: m_texture(path)
, m_anchorPoint(anchorPoint.value_or(m_texture.size * 0.5)) {}
explicit AnchoredTexture(const Image& image, const Optional<Vec2>& anchorPoint = unspecified)
: m_texture(image)
, m_anchorPoint(anchorPoint.value_or(m_texture.size * 0.5)) {}
explicit AnchoredTexture(const Texture& texture, const Optional<Vec2>& anchorPoint = unspecified)
: m_texture(texture)
, m_anchorPoint(anchorPoint.value_or(m_texture.size * 0.5)) {}
void setAnchorPoint(const Vec2& pos)
{
m_anchorPoint = pos;
}
const Vec2& getAnchorPoint() const
{
return m_anchorPoint;
}
void draw(double x, double y) const
{
draw(Vec2(x, y));
}
void draw(const Vec2& pos) const
{
m_texture.draw(pos - m_anchorPoint);
}
void drawRotate(const Vec2& pos, double angle) const
{
m_texture.rotateAt(m_anchorPoint, angle).draw(pos - m_anchorPoint);
}
};
void Main()
{
AnchoredTexture texture(L"example/windmill.png", Vec2(100, 50));
while (System::Update())
{
texture.draw(Mouse::Pos());
}
}