表紙の写真

OpenSiv3Dを使う

先日、OpenSiv3D(オープンシブスリーディー)というライブラリを見つけました。IPAの未踏クリエーターとして認定された鈴木遼さんという方が作ったインタラクション(相互作用)を気軽に行うことのできるライブラリです。インタラクションアプリの開発以外にゲームの開発にも向いています。

OpenSiv3Dの特徴は高性能の描画能力にあるのですが、特筆すべきなのはメインロジックの記述が簡単に始められる点にあります。メインロジックの記述が容易であるということは、プログラミングに必要なリソースを、すべてメインロジックの組み立てに傾けることができるということです。

一般的なグラフィックライブラリは、画面表示を行うまでに憶えることが多く、その時点でくじけてしまう人も少なくありません。OpenSiv3Dはフレームワーク側を初期化するための準備に割く手間を省いてくれるので、いきなりグラフィック周りを実装することもできます。グラフィックのほか、オーディオ周りも整備されており、すぐに使うことができます。

このOpenSiv3Dを使ってゲーム開発をしてみようと思います。主に自分のための備忘録ですが、読み物風にアレンジして公開していきます。

エントリポイント

OpenSiv3Dのエントリポイントはmain関数ではなくMain関数です。引数はなく、戻り値はvoid型。メインロジックはwhileステートメントの中へ記述していきます。System::Updateメソッドがtrueを返す間、つまり更新処理が必要な間、メインロジックを処理させます。このような処理は一般的にはこれをメインループと呼ばれています。

#include <Siv3D.hpp>

void Main() {
    while(System::Update()) {
        // write main logic here.
    }
}

OpenSiv3Dが終了するタイミング

System::Updateメソッドがfalseを返すのは、次のケースに当てはまるときです。

・ユーザーが終了イベントを実行させた
・System::Exitが呼ばれた
・Main関数内で明示的にreturnされた
・Main関数内で捕捉されない例外があった

下の3つはプログラマが意識してロジックを組めばよいのですが、終了イベントはアプリを使うユーザ側のアクションを契機にして実施されてるという点で他の3つとは異なります。

終了イベントについて少し説明しておこうと思います。

終了イベント

終了イベントとは、OpenSiv3Dの処理を終了させるために起こるイベントで、デフォルト設定ではユーザがウィンドウの×ボタンが押すか、エスケープキーが押した場合にイベントが発生します。

ウィンドウの×ボタンが押された場合の挙動はウィンドウ管理システム上で走るプログラムであればなんとなく理解できると思いますが、エスケープキーで処理が終了してしまうのはフルスクリーンのアプリに馴染みがない人にはなかなか理解されないかもしれません。

フルスクリーンアプリにもいくつか種類があり、その中でCUI(Cursor User Interface)の対話型アプリ、コマンドを打ち込んでその結果を得るタイプのアプリであれば、たとえばexitコマンドやquitコマンドを打ち込めば処理を終了させることができます。

しかし、ゲームのように基本的にはノンストップで動き続け、ユーザが終了コマンドを打ち込むことができないタイプのフルスクリーンアプリでは終了させる契機はそれほどありません。

コンシューマゲームでは、電源ボタンを切れば済むかもしれませんが、ウィンドウ管理システム上でいくつかのプログラムの中の1つとして動いているプログラムを終了させるために、気軽に電源ボタンを切ることはできないという事情があります。

メインループは言ってみれば無限ループをさせる処理ですから、終了の契機をパソコンに備えつけのキーボードで行わせることがほとんどですし、そういう文化もありました。なぜなら、古いパソコンはマウス付属ではなかったためです。そこで、脱出を意味する「Escape」の名前を冠した特殊なキーを使い、メインループから脱出する処理を書くということがなされました。エスケープキーを押して処理を終了するのには、そういった背景があります。

終了イベントの変更

終了処理を変更するには、System::SetExitEventメソッドを呼び出します。引数はWindowEvent構造体に列挙されている値を与えることができます。これらの値はフラグとなっているため併用することもできます。

WindowEvent::Manualのみ特別で、ユーザアクションによるイベント検出がなされなくなります。プログラマが必ずSystem::Exit()を呼び出すことを保証しなければなりません。プログラムを正しく終了させられなかった場合、最悪はOS再起動となるかもしれませんから上級者向けの設定と言えるでしょう。

CloseButton // ウィンドウの×ボタンが押された
EscapeKey // エスケープキーが押された
LeftClick //マウスが左クリックされた
RightClick //マウスが右クリックされた
Unfocus //ウィンドウのフォーカスが外れる
AnyKey //何らかのキーが押される
Default //デフォルト
Manual //プログラマが必ずSystem::Exitを呼び出す

デフォルト設定では次のような設定がなされています。ウィンドウの×ボタンが押されたことを検知するWindowEvent::CloseButtonと、エスケープキーが押されたことを検知するWindowEvent::EscapeKeyを論理和で設定してあります。

System::SetExitEvent(WindowEvent::Default);

基本的にはデフォルト設定から変更する必要はないと思います。




この記事が気に入ったらサポートをしてみませんか?