0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Siv3d]エスケープキーで終了しないようにする

Last updated at Posted at 2016-06-04

初投稿っす。
Siv3Dでゲーム作りの練習中だけど、まともにゲームを作ろうとするとメニューが必要になる。
一般的なPCゲームだとエスケープキーでメニューが表示されるのが多いけど、Siv3Dのデフォルトではエスケープキーに終了が割り振られていて、押した瞬間終わる。まぁデバッグ中とかだったら楽でいいんだけど、家庭用機でたとえるならスタートボタンを押すと電源OFFみたいなかなりちょっとアレな仕様。
真っ先に変えたいところだけれど、チュートリアルにある設定変更が「右クリックで終了」とか鬼畜にも程がある内容だったので、普通の設定への変更の仕方を記録しておく。

問題点

件のエスケープキーの振る舞いを規定しているのはこちら、System.hpp。

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()をコールすれば問題なく終了できるので、常にこの設定を入れるようにしちゃってもいいと思う。

本題:エスケープキーで終了しないようにする

ゲームプレイ中に変更するものでもないので、メイン関数の初めのほうで設定変更しちゃうのがいいんじゃないでしょうか。

Main.cpp
void Main()
{
	...
	System::SetExitEvent(WindowEvent::CloseButton);
	...
	while(System::Update())
	{
		...
	}
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?