画面内にダイアログ表示もできるDxLib層状構造の提案(ソースコード)【C++】

以前投稿したnoteの続き。
C++/DxLib環境での一時的なポップアップの実装方法を提案する。一時的なポップアップとは、例えば例えばノベルゲーであればセリフを選ぶ画面、戦闘中であればポーズ画面、などなど。

シーンは変わらないがプログラムの流れが大きく変わる状態となる。私は、画面を層状に管理する仕組みを作ればこのようなプログラムも実装できるのではないかと考えた。

名称はCakeeフレームワークである。以下からソースコードにアクセスできる。せっかくならラノベゲー仕様にしようかと思ったのだが余裕がなかったためプロトタイプにも満たないような完成度になっている。しかし肝心のフレームワーク部分は完璧に完成しているため公開する。

コードを動かす

これを実行すると以下のような緑色の画面が出てくる。

これはStoryクラスで定義されている画面であり、Layerを継承している。
このStoryインスタンスはどこでLayerManagerに登録されているのかというと、Main.cppのlm.addLayer関数である。ここで最初のLayerとして追加を行っているのである。
後ろのコマンドラインに「Story::update」とずらずら書かれている所からも分かるように、Story::drawだけではなくStory::updateも呼び出されている。
しばらくするとStory::update内に記述されたmanager->addLayer関数が呼び出されChoicesという画面が自らの上に乗る。

この小さいピンクの画面がChoicesであり、やはりLayerを継承している。Storyの上に重なって表示されているのがわかる。これこそCakeeの目指していた層状構造である。
また、黒いコマンドラインを見ると分かるが、このCohicesの出現中はChoices::updateだけが呼び出されていてStory::updateは呼び出されていないのだ。
この仕様の何がいいかというと、例えばStoryもChoicesもマウスのクリックを監視する必要があった時に、そのクリックを確認する命令をupdateにて記述しておけば、Choicesの出現中はその後ろのStoryのマウスのクリック操作が無効となるのだ。これはダイアログ等を実装する時には有利になる仕様だろう。
さらに待つと次はChoices::updateにてmanager->requireDelete関数が呼ばれる。これは何をする関数かというと、引数に指定されたLayerを層から削除する。

これによってChoicesが削除され、元のStoryのみが表示されるようになった。同時に、Story::updateが呼び出されるようになった。

あみーーごー!
1

パメル

学生。「考えることを止めない」ことが一番大事だと思う。 休日にやっていることはピアノとゴルフと音楽制作と散歩。 プログラミングを勉強しています。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。