ページ 1 / 1
サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月21日(土) 15:06
by とんとん
何回もすみません。
支館のサウンドのベルの構造を教えてください。
サウンドのベルのシーンが一瞬表示されて直本編に戻ります。
(そしてその後の中ボスなども上で止まってしまって降りてこなくなります)
何故なのでしょうか?お願いします。(もう手に負えない感じです)
Re: とんとん
Posted: 2015年11月21日(土) 15:20
by amehirune
支館というのは、以前私が張った、あのページでしょうか?
もしかしたら、1フレーム中にすべての文章再生を終了してしまっているのかもしれません。
該当する部分のソースコードを載せていただければ、もう少しわかりやすい回答が得られるかもしれません。
オフトピック
コードを載せるときは、ちゃんとcodeタグで囲ってくださいね☆
Re: とんとん
Posted: 2015年11月21日(土) 15:36
by とんとん
はい。そのページです。
コード:
#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];//サウンドノベル用
といった感じです。お願いしますー。
Re: とんとん
Posted: 2015年11月21日(土) 18:21
by naohiro19
タイトルが・・・(笑)
Re: とんとん
Posted: 2015年11月21日(土) 19:15
by とんとん
あぁ、何でこんなタイトルになっているんでしょ、、、。あぁ、やだ。。。
そして、質問の答えもよければお願い致します
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月21日(土) 21:00
by amehirune
うーん…
時間がなくてさらっと見た限りですが、それでも良ければご参考にどうぞ。(参考になるのか?)
症状を聞く限り、原因として考えられるのは、以下の項目です。
・fantasy_disp関数を1回読みだしたとき、最後のif文でいきなり終端判定がなされている
・それ以外の呼び出し関数で、func_stateの値を変更している可能性がある
申し訳ありませんが、一度140行目あたりに" printfDx("終了判定!\n"); "と試しに入れてみてもらえませんか?
左上にその文章が表示されていれば下の、表示されていなければ上の原因に該当している可能性があります。
このような解答しかできなくてごめんなさい><
この掲示板にはもっと優秀な方がいらっしゃるので…w
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 08:42
by とんとん
遅れて申し訳ございません。おはようございますー。
どうやら原因は下のようです。
ですが、どこでfunc_stateの値を変更してしまっているのでしょうか。
参照、検索などで調べてみてもそれらしきものは見つかりません。
どのように探せばいいのでしょうか?
お願いします、、、。(あと、プログラムは龍神録のものです)
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 09:00
by とんとん
あ、終わるときの136行目のところに文字を入れたらダイジョウブでした。
ですが、表示される文字がおかしいです。(しばらくしたら右上のパワー表示などもおかしくなりました)
どうすればいいのでしょうか?
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 09:11
by みけCAT
とんとん さんが書きました:どうすればいいのでしょうか?
デバッグをすればいいでしょう。
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 09:23
by とんとん
とはいえ、どこでブレーク張るかが検討付かないのですー、、、
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 10:00
by softya(ソフト屋)
ある程度以上の規模のプログラムのバグは、本人がバグを取るしかありません。
私が前にできるだけ単純なプログラムで動作確認して欲しいと言ったのはデバッグが難しくなるからです。
で、自分で選んだ苦しい方法ですから頑張ってもらうしか無いわけで。
>ですが、表示される文字がおかしいです。(しばらくしたら右上のパワー表示などもおかしくなりました)
情報不足です。どうおかしいのわかりません。
状況再現できるはとんとんさんだけですから、とんとんさんの情報が正確でないと得られるアドバイスも不正確になります。
今の情報だと、一番厄介な配列添え字外のアクセスやポインタ操作ミスが考えられます。
> とはいえ、どこでブレーク張るかが検討付かないのですー、、
それはプログラムの動作を把握できていないからですね。
本来なら、自分のわかる範囲の限定できるコンパクトなプログラムで実装実験すべきです。
デバッグは経験を積むしか無いですが、大きなプログラムでは訳が分からなくなるので初心者にデバッグが困難です。
でもデバッグはプログラミングの最重要スキルですので、プログラムコードを組めるより重要だったりします。
プログラムが完成しませんから。
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 11:19
by とんとん
たくさんの・・・・・と、たまに何かの記号が現れます。(おそらく1フレームごとにかわっていっているので
よめません)
謎現象です。
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 11:22
by とんとん
できれば、サウスさんのページで紹介されているサウンドのベルのcsvファイルの書き方を教えてください。
Re: サウスさんのサウンドのベルのバグ(?)
Posted: 2015年11月22日(日) 14:19
by softya(ソフト屋)
とんとん さんが書きました:たくさんの・・・・・と、たまに何かの記号が現れます。(おそらく1フレームごとにかわっていっているので
よめません)
謎現象です。
テキストをちゃんと読み込めていないんでしょうね。
たとすれば、読み込みの所を調べるべきでしょう。
とんとん さんが書きました:できれば、サウスさんのページで紹介されているサウンドのベルのcsvファイルの書き方を教えてください。
これは、プログラムを解析したけどわからなかったと言うことでしょうか?
ならば、何処の部分がわからないかピンポイントで質問をお願いします。