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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 四聖龍神録2プログラミングの館について

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

#5

by にこよん » 11ヶ月前

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

それは考え付きませんでした
原因を探りながら自分で実装してみようと思います
ありがとうございましたm(__)m

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

#4

by もるも » 11ヶ月前

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

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


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

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

#3

by にこよん » 11ヶ月前

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

コード:

// シーンを変更する
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;
}
もともと最初の投稿で赤線で引いた部分はプログラミングの館では書かれていなかったので、これ以外で形を変更せずに戻れる方法があると思ったのですが、それはないのでしょうか?
コードはそこで配布されているものを流用しているのでほぼ変わらないはずです

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

#2

by もるも » 11ヶ月前

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

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

#1

by にこよん » 11ヶ月前

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

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

コード:

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;
}

ページトップ