初投稿っす。
Siv3Dでゲーム作りの練習中だけど、まともにゲームを作ろうとするとメニューが必要になる。
一般的なPCゲームだとエスケープキーでメニューが表示されるのが多いけど、Siv3Dのデフォルトではエスケープキーに終了が割り振られていて、押した瞬間終わる。まぁデバッグ中とかだったら楽でいいんだけど、家庭用機でたとえるならスタートボタンを押すと電源OFFみたいなかなりちょっとアレな仕様。
真っ先に変えたいところだけれど、チュートリアルにある設定変更が「右クリックで終了」とか鬼畜にも程がある内容だったので、普通の設定への変更の仕方を記録しておく。
問題点
件のエスケープキーの振る舞いを規定しているのはこちら、System.hpp。
struct WindowEvent
{
enum Flag : uint32
{
/// <summary>
/// ウィンドウの [x] ボタンが押される
/// </summary>
CloseButton = 0x01,
/// <summary>
/// エスケープキーが押される
/// </summary>
EscapeKey = 0x02,
/// <summary>
/// マウスの左クリック
/// </summary>
LeftClick = 0x04,
/// <summary>
/// マウスの右クリック
/// </summary>
RightClick = 0x08,
/// <summary>
/// ウィンドウのフォーカスが外れる
/// </summary>
Unfocus = 0x10,
/// <summary>
/// 何らかのキーが押される
/// </summary>
AnyKey = 0x20,
/// <summary>
/// デフォルト(ウィンドウの [x] ボタンが押されるか、エスケープキーが押される)
/// </summary>
Default = CloseButton | EscapeKey,
/// <summary>
/// 設定しない
/// </summary>
/// <remarks>
/// 必ず System::Exit() を実行して終了する必要があります。
/// </remarks>
Manual = 0x00,
};
};
このWindowsEventをSystem::SetExitEvent()へ渡してあげれば設定完了。ちなみにこのDefaultが妖怪「エスケープで終了」の正体ぢゃ。
マウスカーソルが使える&ウィンドウモードだったらCloseButtonのみにするのがいいんだろう。フルスクリーン前提のゲームやマウスカーソルを消して使う場合は×ボタンがクリック出来ないわけだけど、そういう場合もこの設定のままSystem::Exit()をコールすれば問題なく終了できるので、常にこの設定を入れるようにしちゃってもいいと思う。
本題:エスケープキーで終了しないようにする
ゲームプレイ中に変更するものでもないので、メイン関数の初めのほうで設定変更しちゃうのがいいんじゃないでしょうか。
void Main()
{
...
System::SetExitEvent(WindowEvent::CloseButton);
...
while(System::Update())
{
...
}
}