サウスさんのサウンドのベルのバグ(?)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
とんとん
記事: 33
登録日時: 3年前
連絡を取る:

サウスさんのサウンドのベルのバグ(?)

#1

投稿記事 by とんとん » 3年前

何回もすみません。
支館のサウンドのベルの構造を教えてください。
サウンドのベルのシーンが一瞬表示されて直本編に戻ります。
(そしてその後の中ボスなども上で止まってしまって降りてこなくなります)
何故なのでしょうか?お願いします。(もう手に負えない感じです)
最後に編集したユーザー とんとん on 2015年11月21日(土) 20:12 [ 編集 1 回目 ]

アバター
amehirune
記事: 181
登録日時: 5年前
住所: どっか
連絡を取る:

Re: とんとん

#2

投稿記事 by amehirune » 3年前

支館というのは、以前私が張った、あのページでしょうか?
もしかしたら、1フレーム中にすべての文章再生を終了してしまっているのかもしれません。
該当する部分のソースコードを載せていただければ、もう少しわかりやすい回答が得られるかもしれません。
オフトピック
コードを載せるときは、ちゃんとcodeタグで囲ってくださいね☆
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: とんとん

#3

投稿記事 by とんとん » 3年前

はい。そのページです。

コード:

#include "../include/GV.h"

//ストーリーデータの読み込み
void fantasy_load( char *entry ){
	int load_data ;		//ファイル読み込み用
	int x = 0 , y = 0 ;	//横列、縦列
	char take[2] ;	//読み込みデータ

	/* データファイルを開く */
	load_data = FileRead_open( entry ) ;
	if(load_data == NULL){
		printfDx("read error\n") ;
		return ;
	}

	/* 各データに分けて取得 */
	while( FileRead_eof( load_data ) == 0 )
	{
		/* 名前の取得 */
		for( x=0 ; x < 50 ; x++ ){
			story[y].name[x] = FileRead_getc( load_data ) ;	//文字列を抜き出す
			if( story[y].name[x] == ', ' ){					//「:」までループ
				story[y].name[x] = ' ' ;
				break ;
			}
		}

		/* 種類の取得 */
		take[0] = FileRead_getc( load_data ) ;
		take[1] = ' ' ;
		story[y].type = atoi( take ) ;		//情報の格納
		FileRead_getc( load_data ) ;		//1バイトスキップ

		/* 表情の取得 */
		take[0] = FileRead_getc( load_data ) ;
		take[1] = ' ' ;
		story[y].look = atoi( take ) ;
		FileRead_getc( load_data ) ;

		/* ポーズの取得 */
		take[0] = FileRead_getc( load_data ) ;
		take[1] = ' ' ;
		story[y].look = atoi( take ) ;
		FileRead_getc( load_data ) ;

		/* 本文の取得 */
		FileRead_gets( story[y].story , 256, load_data ) ;

		++ y ;	//情報階層の移動
	}
	story[y].story[0] = ' ';

	/* ファイルを閉じる */
	FileRead_close( load_data ) ;

	return ;
}

//本文表示
void fantasy_disp(){
	static int y , x ;			//chra型の[縦y]と[横x](座標ではない)
	static int dy;				//表示用の[縦dy]
	static char disp[5][256];	//表示用
	int loop = 0;				//改行用
	int len;
	int len2;
	int i;						//for用

	//エンターが押された時の割り込み処理
	if( CheckStatePad(configpad.shot) == 1 ){
		if( story[y].story[x] == 'C' ){
			x = 0;
			dy = 0;
			++ y;
		}else{
			while( story[y].story[x] != 'C' ){
				if( story[y].story[x] == ' ' ){
					x=0;
					++ y;
					++ dy;
				}
				for( i=0 ; i<2; i++ ){
					disp[dy][x+i] = story[y].story[x+i] ;
				}
				disp[dy][x+i] = ' ';
				x += 2 ;
			}
		}
	}

	//一文字(1バイト)について処理分け
	switch( story[y].story[x] ){
		case 'C' :
			//何もしない
			break;
		case '\0' :	//改行表示処理
			x = 0;
			++ y;
			++ dy;
			disp[dy][x] = ' ';	
			break;
		default :
			//2バイトの全角文字の読み込み
			for( i=0 ; i<2; i++ ){
				disp[dy][x+i] = story[y].story[x+i] ;
			}
			disp[dy][x+i] = ' ';	//nullで閉める(お約束)
			x += 2 ;	//次回読み込み位置の変更
			break;
	}

	//背景を暗く
	SetDrawBlendMode( DX_BLENDMODE_ALPHA , 80 ) ;
	DrawBox( FX , FY , FX+FMX , FY+FMY , color[1] , TRUE ) ;
	DrawBox( FX , 410 , FX+FMX , FY+FMY , color[0] , TRUE ) ;
	SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;
	//名前
	len = GetDrawFormatStringWidthToHandle( font[0] , story[y].name );
	DrawFormatStringToHandle( 100 , 393 , color[0] , font[0] , "%s" , story[y].name );
	//本文
	while ( dy >= loop ){
		DrawFormatStringToHandle( 50 + len , 420+20*loop , color[0] , font[0] , "%s" , disp[loop] );
		++ loop;
	}
	// 」.(停止中なら)
	if( story[y].story[x] == 'C' ){
		len2 = GetDrawFormatStringWidthToHandle( font[0] , "%s" , disp[dy] );
		if( count%30 < 15)
			DrawFormatStringToHandle( 50 + len + len2 , 420+20*dy , color[0] , font[0] , "」");
		else
			DrawFormatStringToHandle( 50 + len + len2 , 420+20*dy , color[0] , font[0] , "」.");
	}


	//ENDフラグが立ってたら終了
	if( story[y].story[0] == ' ' ){
		func_state = 100;
		x    = 0;
		y    = 0;
		dy   = 0;
	}
	return ;
}

//サウンドノベル割り込み判断
void fantasy_check(){
	//ステージカウント49の時に指定のファイルを読み込みサウンドノベル処理へ
	if( stage_count == 49 ){//カウント49
		fantasy_load( "32-2.csv" );//指定のファイル(プロジェクトと同じ階層)
		func_state = 103;//サウンドノベル処理へ
	}
}
他のクラスにはちゃんと書くべき事は書いてあります。
main.cpp

コード:

			case 103://ラノベ
				calc_ch();
				ch_move();
				calc_option_bb();
				graph_main();
				fantasy_disp();
				break;
fantasy_check();
struct.h

コード:

//物語(ストーリー)に関数構造体
typedef struct{
	int type;		//種類
	int look;		//表情
	int pose;		//ポーズ
	char name[50];	//名前
	char story[256];//本文
}story_t;
GV.h
GLOBAL story_t story[50];//サウンドノベル用

といった感じです。お願いしますー。

naohiro19
記事: 256
登録日時: 8年前
住所: 愛知県

Re: とんとん

#4

投稿記事 by naohiro19 » 3年前

タイトルが・・・(笑)

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: とんとん

#5

投稿記事 by とんとん » 3年前

あぁ、何でこんなタイトルになっているんでしょ、、、。あぁ、やだ。。。
そして、質問の答えもよければお願い致します

アバター
amehirune
記事: 181
登録日時: 5年前
住所: どっか
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#6

投稿記事 by amehirune » 3年前

うーん…
時間がなくてさらっと見た限りですが、それでも良ければご参考にどうぞ。(参考になるのか?)

症状を聞く限り、原因として考えられるのは、以下の項目です。
・fantasy_disp関数を1回読みだしたとき、最後のif文でいきなり終端判定がなされている
・それ以外の呼び出し関数で、func_stateの値を変更している可能性がある
申し訳ありませんが、一度140行目あたりに" printfDx("終了判定!\n"); "と試しに入れてみてもらえませんか?
左上にその文章が表示されていれば下の、表示されていなければ上の原因に該当している可能性があります。

このような解答しかできなくてごめんなさい><
この掲示板にはもっと優秀な方がいらっしゃるので…w
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#7

投稿記事 by とんとん » 3年前

遅れて申し訳ございません。おはようございますー。
どうやら原因は下のようです。
ですが、どこでfunc_stateの値を変更してしまっているのでしょうか。
参照、検索などで調べてみてもそれらしきものは見つかりません。
どのように探せばいいのでしょうか?
お願いします、、、。(あと、プログラムは龍神録のものです)

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#8

投稿記事 by とんとん » 3年前

あ、終わるときの136行目のところに文字を入れたらダイジョウブでした。
ですが、表示される文字がおかしいです。(しばらくしたら右上のパワー表示などもおかしくなりました)
どうすればいいのでしょうか?

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#9

投稿記事 by みけCAT » 3年前

とんとん さんが書きました:どうすればいいのでしょうか?
デバッグをすればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#10

投稿記事 by とんとん » 3年前

とはいえ、どこでブレーク張るかが検討付かないのですー、、、

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 8年前
住所: 東海地方
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#11

投稿記事 by softya(ソフト屋) » 3年前

ある程度以上の規模のプログラムのバグは、本人がバグを取るしかありません。
私が前にできるだけ単純なプログラムで動作確認して欲しいと言ったのはデバッグが難しくなるからです。
で、自分で選んだ苦しい方法ですから頑張ってもらうしか無いわけで。

>ですが、表示される文字がおかしいです。(しばらくしたら右上のパワー表示などもおかしくなりました)

情報不足です。どうおかしいのわかりません。
状況再現できるはとんとんさんだけですから、とんとんさんの情報が正確でないと得られるアドバイスも不正確になります。
今の情報だと、一番厄介な配列添え字外のアクセスやポインタ操作ミスが考えられます。

> とはいえ、どこでブレーク張るかが検討付かないのですー、、

それはプログラムの動作を把握できていないからですね。
本来なら、自分のわかる範囲の限定できるコンパクトなプログラムで実装実験すべきです。
デバッグは経験を積むしか無いですが、大きなプログラムでは訳が分からなくなるので初心者にデバッグが困難です。
でもデバッグはプログラミングの最重要スキルですので、プログラムコードを組めるより重要だったりします。
プログラムが完成しませんから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#12

投稿記事 by とんとん » 3年前

たくさんの・・・・・と、たまに何かの記号が現れます。(おそらく1フレームごとにかわっていっているので
よめません)
謎現象です。

とんとん
記事: 33
登録日時: 3年前
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#13

投稿記事 by とんとん » 3年前

できれば、サウスさんのページで紹介されているサウンドのベルのcsvファイルの書き方を教えてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 8年前
住所: 東海地方
連絡を取る:

Re: サウスさんのサウンドのベルのバグ(?)

#14

投稿記事 by softya(ソフト屋) » 3年前

とんとん さんが書きました:たくさんの・・・・・と、たまに何かの記号が現れます。(おそらく1フレームごとにかわっていっているので
よめません)
謎現象です。
テキストをちゃんと読み込めていないんでしょうね。
たとすれば、読み込みの所を調べるべきでしょう。
とんとん さんが書きました:できれば、サウスさんのページで紹介されているサウンドのベルのcsvファイルの書き方を教えてください。
これは、プログラムを解析したけどわからなかったと言うことでしょうか?
ならば、何処の部分がわからないかピンポイントで質問をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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