STLコンテナStackの動作について
Posted: 2019年9月29日(日) 20:36
龍神録2プログラミングの館にてC++オブジェクト指向によるゲーム製作を勉強しています。
同サイトの第5章( https://dixq.net/rp2/05.html )にて以下のようなシーンを変更するメゾットがあるのですが、引数のstackClearがtrueのときはSOMESceneインスタンスが1回全てクリアされます。
このメゾットをSOMESceneから呼び出しているのですが、以下のようなメゾットだと自分自身のクラスのインスタンスがクリアされてからreturn;を行っているように見えます。ですが正しく実行されています。
return文が存在しない場合はアクセス違反(?)が起きて強制終了しました。
このようにインスタンスがクリアされた後にそのインスタンスのreturn文を実行する場合は問題がないのでしょうか?
また、シーンを一つ戻すような動作をさせるメゾットをonSceneChangedと同じように作ることを考えています。
この場合Looperクラスにて_sceneStack.pop()を一度行えばいいと思うのですがいかがでしょうか?
同サイトの第5章( https://dixq.net/rp2/05.html )にて以下のようなシーンを変更するメゾットがあるのですが、引数のstackClearがtrueのときはSOMESceneインスタンスが1回全てクリアされます。
// Looper.cpp
void Looper::onSceneChanged(const eScene scene, const Parameter& parameter, const bool stackClear)
{
if (stackClear) {//スタッククリアなら
while (!_sceneStack.empty()) {//スタックを全部ポップする(スタックを空にする)
_sceneStack.pop();
}
}
switch (scene) {
case Title:
_sceneStack.push(make_shared<TitleScene>(this, parameter));
break;
case Game:
_sceneStack.push(make_shared<GameScene>(this, parameter));
break;
default:
//どうしようもないエラー発生
break;
}
}
void TitleScene::update()
{
if (CheckHitKey(KEY_INPUT_E)) {
Parameter parameter;
parameter.set(GameScene::ParameterTagLevel, Define::eLevel::Easy);
const bool stackClear = false;
_implSceneChanged->onSceneChanged(eScene::Game, parameter, stackClear);
return;
}
if (CheckHitKey(KEY_INPUT_N)) {
Parameter parameter;
parameter.set(GameScene::ParameterTagLevel, Define::eLevel::Normal);
const bool stackClear = false;
_implSceneChanged->onSceneChanged(eScene::Game, parameter, stackClear);
return;
}
}
このようにインスタンスがクリアされた後にそのインスタンスのreturn文を実行する場合は問題がないのでしょうか?
また、シーンを一つ戻すような動作をさせるメゾットをonSceneChangedと同じように作ることを考えています。
この場合Looperクラスにて_sceneStack.pop()を一度行えばいいと思うのですがいかがでしょうか?