13. 絵文字を描く¶
画面に絵文字を描く方法を学びます。
13.1 テクスチャと絵文字¶
テクスチャ¶
- Siv3D では、画面に描く画像をテクスチャ(
Textureクラス)で管理します - テクスチャは、画像ファイルや、プログラムで生成した画像から作成できます
- テクスチャの最も簡単な作り方は、絵文字から作ることです
絵文字の種類¶
- Siv3D には 3,700 種類以上の絵文字が標準で同梱されています
- 次のような簡単なコードで、絵文字からテクスチャを作成できます
- Siv3D で使える絵文字一覧は Emojipedia: Google Noto Color Emoji で確認できます
- Siv3D ではどのプラットフォーム(Windows, macOS, Linux, Web)でも同じデザインの絵文字を描画できます
13.2 絵文字を描く¶
- テクスチャの作成はコストがかかるため、メインループの前で行います
- テクスチャを画面に表示するには、
.drawAt(x, y)または.drawAt(pos)を使います- 指定した座標を中心としてテクスチャを描画します

# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Texture emoji1{ U"🐈"_emoji };
const Texture emoji2{ U"🍎"_emoji };
while (System::Update())
{
emoji1.drawAt(100, 100);
emoji1.drawAt(400, 300);
emoji2.drawAt(200, 300);
emoji2.drawAt(Cursor::Pos());
}
}
13.3 絵文字を拡大縮小する¶
- デフォルトの絵文字の大きさは余白(透明部分)も含めて 136x128 ピクセルです
.drawAt()の前に.scaled(倍率)を挟むことで、テクスチャを指定した倍率で拡大縮小して描画できます- 例えば
.scaled(0.5).drawAt(Cursor::Pos());は、テクスチャを 50 % の大きさで描画します

# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Texture emoji1{ U"🐈"_emoji };
const Texture emoji2{ U"🍎"_emoji };
while (System::Update())
{
emoji1.scaled(0.5).drawAt(100, 100);
emoji1.scaled(2).drawAt(400, 300);
emoji2.scaled(0.3).drawAt(200, 300);
}
}
13.4 絵文字を回転させる¶
.drawAt()の前に.rotated(時計回りの角度)を挟むことで、テクスチャを指定した角度で回転させて描画できます- 角度は 1 周 360° を 2π とするラジアン単位で指定します
- 慣れている度数法を使いたい場合、
45_deg,90_degのように度数法をラジアンに変換する_degリテラルを使います
| _deg 記法 | ラジアン |
|---|---|
0_deg |
0.0 |
45_deg |
0.78539816339 |
90_deg |
1.57079632679 |
180_deg |
3.14159265359 |
360_deg |
6.28318530718 |
- 例えば
10_degを指定すると、絵文字が時計回りに 10° 回転します

# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Texture emoji1{ U"🐈"_emoji };
const Texture emoji2{ U"🍎"_emoji };
while (System::Update())
{
emoji1.rotated(10_deg).drawAt(100, 100);
emoji1.rotated(-45_deg).drawAt(400, 300);
emoji2.rotated(180_deg).drawAt(200, 300);
}
}
13.5 絵文字の拡大縮小と回転を組み合わせる¶
.scaled(倍率).rotated(時計回りの角度)を使うことで、拡大縮小と回転を同時に行えます

# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Texture emoji1{ U"🐈"_emoji };
const Texture emoji2{ U"🍎"_emoji };
while (System::Update())
{
emoji1.scaled(0.5).rotated(10_deg).drawAt(100, 100);
emoji1.scaled(2).rotated(-45_deg).drawAt(400, 300);
emoji2.scaled(0.3).rotated(180_deg).drawAt(200, 300);
}
}
13.6 絵文字を左右反転させる¶
.drawAt()の前に.mirrored(反転)を挟むことで、テクスチャを左右反転して描画できます反転はbool型で、trueを指定すると左右反転します。falseの場合は元の向きで描画します- 次のコードは、マウスカーソルの X 座標を
Cursor::Pos().xによって取得し、マウスカーソルが絵文字の右側にある場合、絵文字を左右反転して(猫を右に向けて)描画します

マウスカーソルの X 座標に応じて絵文字を左右反転させる
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Texture emoji1{ U"🐈"_emoji };
while (System::Update())
{
const int32 cursorX = Cursor::Pos().x;
emoji1.mirrored(400 <= cursorX).drawAt(400, 300);
}
}
振り返りチェックリスト¶
- 画像を描くときはテクスチャを使うことを学んだ
- 絵文字からテクスチャを作成できることを学んだ
- Siv3D で使える絵文字は 3,000 種類以上あり、どのプラットフォームでも同じデザインで描画できることを学んだ
- テクスチャはメインループの前で作成することを学んだ
-
.drawAt(x, y)または.drawAt(pos)でテクスチャを画面に表示することを学んだ -
.scaled(倍率)でテクスチャを拡大縮小することを学んだ -
.rotated(時計回りの角度)でテクスチャを回転させることを学んだ -
_degリテラルを使うと、角度を度数法で記述できることを学んだ -
.scaled(倍率).rotated(時計回りの角度)で、テクスチャの拡大縮小と回転を同時に行うことを学んだ -
.mirrored(反転)でテクスチャを左右反転させることを学んだ