10. ボタンを作る
10.1 最初の関数
# include <Siv3D.hpp>
void Button()
{
Rect{ 250, 300, 300, 80 }.draw(ColorF{ 0.3, 0.7, 1.0 });
}
void Main()
{
while (System::Update())
{
Button();
}
}
10.2 領域を指定できるようにする
- 好きな場所に好きな大きさのボタンを作れるようにします
int32
, bool
, double
などの基本型以外の型はすべて const 参照渡しをします
# include <Siv3D.hpp>
void Button(const Rect& rect)
{
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
}
void Main()
{
while (System::Update())
{
Button(Rect{ 250, 300, 300, 80 });
Button(Rect{ 250, 400, 300, 80 });
}
}
10.3 テキストを指定できるようにする
# include <Siv3D.hpp>
void Button(const Rect& rect, const Font& font, const String& text)
{
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2));
}
void Main()
{
Font font{ FontMethod::MSDF, 48, Typeface::Bold };
while (System::Update())
{
Button(Rect{ 250, 300, 300, 80 }, font, U"つづきから");
Button(Rect{ 250, 400, 300, 80 }, font, U"最初から");
}
}
10.4 マウスカーソルを手のアイコンにする
- ボタンの上にマウスカーソルを重ねると、マウスカーソルが手のアイコンに変わるようにします
# include <Siv3D.hpp>
void Button(const Rect& rect, const Font& font, const String& text)
{
if (rect.mouseOver())
{
Cursor::RequestStyle(CursorStyle::Hand);
}
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2));
}
void Main()
{
Font font{ FontMethod::MSDF, 48, Typeface::Bold };
while (System::Update())
{
Button(Rect{ 250, 300, 300, 80 }, font, U"つづきから");
Button(Rect{ 250, 400, 300, 80 }, font, U"最初から");
}
}
10.5 押せるかどうかを指定できるようにする
# include <Siv3D.hpp>
void Button(const Rect& rect, const Font& font, const String& text, bool enabled)
{
if (enabled && rect.mouseOver())
{
Cursor::RequestStyle(CursorStyle::Hand);
}
if (enabled)
{
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2));
}
else
{
rect.draw(ColorF{ 0.5 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2), ColorF{ 0.7 });
}
}
void Main()
{
Font font{ FontMethod::MSDF, 48, Typeface::Bold };
while (System::Update())
{
Button(Rect{ 250, 300, 300, 80 }, font, U"つづきから", false);
Button(Rect{ 250, 400, 300, 80 }, font, U"最初から", true);
}
}
10.6 押されたかどうかを返す
- ボタンが押されたかを戻り値で返すようにします
- 押せないボタンは、押しても
false
を返します
# include <Siv3D.hpp>
bool Button(const Rect& rect, const Font& font, const String& text, bool enabled)
{
if (enabled && rect.mouseOver())
{
Cursor::RequestStyle(CursorStyle::Hand);
}
if (enabled)
{
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2));
}
else
{
rect.draw(ColorF{ 0.5 });
font(text).drawAt(40, (rect.x + rect.w / 2), (rect.y + rect.h / 2), ColorF{ 0.7 });
}
return (enabled && rect.leftClicked());
}
void Main()
{
Font font{ FontMethod::MSDF, 48, Typeface::Bold };
while (System::Update())
{
if (Button(Rect{ 250, 300, 300, 80 }, font, U"つづきから", false))
{
Print << U"つづきから";
}
if (Button(Rect{ 250, 400, 300, 80 }, font, U"最初から", true))
{
Print << U"最初から";
}
}
}
10.7 絵文字を追加する
# include <Siv3D.hpp>
bool Button(const Rect& rect, const Texture& emoji, const Font& font, const String& text, bool enabled)
{
if (enabled && rect.mouseOver())
{
Cursor::RequestStyle(CursorStyle::Hand);
}
if (enabled)
{
rect.draw(ColorF{ 0.3, 0.7, 1.0 });
font(text).drawAt(40, (rect.x + rect.w / 2 + 30), (rect.y + rect.h / 2));
}
else
{
rect.draw(ColorF{ 0.5 });
font(text).drawAt(40, (rect.x + rect.w / 2 + 30), (rect.y + rect.h / 2), ColorF{ 0.7 });
}
emoji.scaled(0.5).drawAt(rect.x + 60, rect.y + 40);
return (enabled && rect.leftClicked());
}
void Main()
{
Texture emojiBread{ U"🍞"_emoji };
Texture emojiRice{ U"🍚"_emoji };
Font font{ FontMethod::MSDF, 48, Typeface::Bold };
while (System::Update())
{
if (Button(Rect{ 250, 300, 300, 80 }, emojiBread, font, U"パン", false))
{
Print << U"パン";
}
if (Button(Rect{ 250, 400, 300, 80 }, emojiRice, font, U"米", true))
{
Print << U"米";
}
}
}