四聖龍神録2プログラミングの館について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

四聖龍神録2プログラミングの館について

#1

投稿記事 by にこよん » 5年前

こちらのサイトを参考にプログラムを作っているのですが、一つ前のシーンを保存していても、戻ることができません
どのようにすれば戻ることができますか?
それとも現在公開されている章まででは戻る方法はありませんか?

一応以下のようにすれば戻れなくない気もするのですが、余りいい方法とは思えないので....

コード:

void Looper::onSceneChanged(const eScene scene, const Parameter& parameter, const bool stackClear, const bool back)
{
	if (stackClear) {						// スタッククリアなら
		while (!_sceneStack.empty()) {		// スタックを全部ポップする(スタックを空にする)
			_sceneStack.pop();
		}
	}
	if (back)
	{
		_sceneStack.pop();
	}

	switch (scene) {
	case Logo:
		_sceneStack.push(make_shared<LogoScene>(this, parameter));
		break;
	case Title:
		_sceneStack.push(make_shared<TitleScene>(this, parameter));
		break;
	case Game:
		_sceneStack.push(make_shared<GameScene>(this, parameter));
		break;
	default:
		ERR("不明なシーンが呼ばれました");
		break;
	}
void Looper::onSceneChanged(const eScene scene, const Parameter& parameter, const bool stackClear, const bool back)
{
if (stackClear) { // スタッククリアなら
while (!_sceneStack.empty()) { // スタックを全部ポップする(スタックを空にする)
_sceneStack.pop();
}
}
if (back)
{
_sceneStack.pop();
}


switch (scene) {
case Logo:
_sceneStack.push(make_shared<LogoScene>(this, parameter));
break;
case Title:
_sceneStack.push(make_shared<TitleScene>(this, parameter));
break;
case Game:
_sceneStack.push(make_shared<GameScene>(this, parameter));
break;
default:
ERR("不明なシーンが呼ばれました");
break;
}
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 四聖龍神録2プログラミングの館について

#2

投稿記事 by もるも » 5年前

パッと見た感じですと、
backフラグの分岐で現在のシーンをポップした後に、
sceneをtop関数(Stackの末尾の要素を得る)で取得していないから反映されず戻れないのだと思います。
(ここにもStackが空っぽかどうかのチェックがほしいかも)

アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

Re: 四聖龍神録2プログラミングの館について

#3

投稿記事 by にこよん » 5年前

ご回答ありがとうございます
空かどうかの確認もするようにしました

コード:

// シーンを変更する
void Looper::onSceneChanged(const eScene scene, const Parameter& parameter, const bool stackClear, const bool back_flag)
{
	if (stackClear)						// スタッククリアなら
	{
		while (!_sceneStack.empty())
		{								// スタックを全部ポップする(スタックを空にする)
			_sceneStack.pop();
		}
	}
	if (back_flag && !_sceneStack.empty())
	{
		_sceneStack.pop();
		return;
	}

	switch (scene) {
	case Logo:
		_sceneStack.push(make_shared<LogoScene>(this, parameter));
		break;
	case Title:
		_sceneStack.push(make_shared<TitleScene>(this, parameter));
		break;
	case Game:
		_sceneStack.push(make_shared<GameScene>(this, parameter));
		break;
	default:
		ERR("不明なシーンが呼ばれました");
		break;
	}
}
>sceneをtop関数(Stackの末尾の要素を得る)で取得していないから
おそらくトップ関数を使って処理しているはずです....

コード:

// 一番上のスタックの処理を行う
bool Looper::loop() const
{
	AllInputUpdate();						// ゲームライブラリを更新する
	_sceneStack.top()->update();
	_sceneStack.top()->draw();
	DrawFormatStringToHandle(0, 0, col.white, GetFont(16), "FPS %4.1f", GetFps());
	FpsWait();
	return true;
}
もともと最初の投稿で赤線で引いた部分はプログラミングの館では書かれていなかったので、これ以外で形を変更せずに戻れる方法があると思ったのですが、それはないのでしょうか?
コードはそこで配布されているものを流用しているのでほぼ変わらないはずです
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 四聖龍神録2プログラミングの館について

#4

投稿記事 by もるも » 5年前

別のところで処理してたんですね。失礼しました。
(そもそもconst付いてるから変更できませんね(-_-;))

ソースコード変更後はポップした後returnしているから新たにシーンがプッシュされることも無いですし・・・。
ほかにアドバイスできることはブレークポイントを使って、
キーやゲームパッドなどの戻るときの入力がされたときに、
戻るためのシーンチェンジ処理にとんで行き、Stackの処理がきちんとされているか。
などの処理の流れを見ながらデバッグして問題ありそうな点を潰していきながら不具合を探す・・・ぐらいですかね。


最適な設計は制作者のDixqさんみぞ知ることですが、
四聖龍神録2プログラミングの館の更新は多忙なようで止まってしまっているようですね。(;^ω^)
シーンチェンジの内容を変更せず戻る方法をとなるならば、戻る処理の関数を自分で作っちゃってもいいんじゃないでしょうか。

アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

Re: 四聖龍神録2プログラミングの館について

#5

投稿記事 by にこよん » 5年前

>シーンチェンジの内容を変更せず戻る方法をとなるならば、戻る処理の関数を自分で作っちゃってもいいんじゃないでしょうか。

それは考え付きませんでした
原因を探りながら自分で実装してみようと思います
ありがとうございましたm(__)m
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

返信

“C言語何でも質問掲示板” へ戻る