めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

OpenSiv3Dでボタンを離したことを検知する

こんにちは、めのんです!

前回はOpenSiv3DのSimpleGUI::Buttonについて調べてみました。 名前の通り本当にシンプルでいいんですけど、ボタンを押したときしかイベントを取れないことがわかりました。

私がやりたいのは、ボタンを押したときにLED器具を点灯させて、ボタンを離したときに消灯させるという動きです。 どうにかしてボタンを離したことを検知しないといけません。

まず、ボタン(正確にいうとマウスの左ボタン)を離したこと自体は簡単に検知することができました。

if (MouseL.up())
{
  // ボタンを離したときの処理
}

これでいいようです。 簡単ですね。

でも、これだけだとどのボタンを離したのかわかりません。 じゃあ、ボタンを囲む矩形の範囲でボタンを離したときだけ有効にすればいいのかというとそんなこともないんですよ。

どういうことかというと、ボタンを押して、そのまま離さずにマウスカーソルを移動させてしまった場合を考えないといけないんですよね。 ちょっと手が動いてしまったとか、故意に動かした場合も含めて、ボタンの領域からマウスカーソルが出てしまうと離せなくなってしまうのは問題です。

ということは、ボタンが押されたときにどのボタンが押されたのかを覚えておいて、マウスの左ボタンが離されたときにはさっき覚えたボタンが離されたんだということを知る必要があります。

# include <Siv3D.hpp>
# include <Windows.h>

void Main()
{
  String pressedButton;

  while (System::Update())
  {
    if (SimpleGUI::Button(U"A", Vec2(100, 100)))
    {
      pressedButton = U"A";
      ::OutputDebugStringW(L"down A\n");
    }

    if (SimpleGUI::Button(U"B", Vec2(100, 150)))
    {
      pressedButton = U"B";
      ::OutputDebugStringW(L"down B\n");
    }

    if (MouseL.up())
    {
      if (pressedButton == U"A")
      {
        // Aボタンが離された
        ::OutputDebugStringW(L"up A\n");
      }
      else if (pressedButton == U"B")
      {
        // Bボタンが離された
        ::OutputDebugStringW(L"up B\n");
      }
      pressedButton = U"";
    }
  }
}

このサンプルではpressedButtonという変数にどのボタンが押されたのかを覚えるようにしています。 もっと簡単に使えるようにするにはクラスにした方がいいんでしょうね。

とにかくこれでやりたいことは実現できるようになりました。 次はフェーダーを作りたいのでスライダーを見ていきたいと思います。 今週は木曜日から連休なので、OpenSiv3Dを触る時間が増えるかなと期待しています。

それでは!!