サウンドノベル風文字列表示法

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

サウンドノベル風文字列表示法

#1

投稿記事 by 電気屋 » 15年前

どうも、たびたびお世話になっています。
今回は、プログラムのバグ(不具合)について聞きたいと思っています。
課題で、友人と一緒にプログラム作成を行っています。
自分の担当は、『サウンドノベル風文字列表示』のような文字表記のところなのですが、
前回教えてもらったプログラムを自分なりにアレンジしたところ様々な不具合が出てきました。
自分では大丈夫だと思っていたのですが、どうもうまく動きません。
プログラムの一部を乗せておくので何処か『ここが悪い!』と思うところがあれば教えてください。
不具合が起こっている可能性でもかまいません。
今の自分ではどうも気づくことができません。どうかお願いします。

値がわからないと答えられない。という人がいるかもしれませんが、そこは、適当に当てはめてください。


※不具合
・会話(内容)をすべて表示しない。
・改行しない
・WaitKey() ;を設定した覚えのないところでKey入力を待つ
・ENDflgを立てても、綺麗に次の関数に行かない
・その他(その他の不具合はある程度検討がついているので自分でどうにかします。)

※求めること
・現状のプログラムで、どこが悪いか?
・IF文よりswitch文の方がよかったのか?
・上記の不具合の改善点
・プログラムの流れは良いか?

※その他の願い
 
 もしプログラムがあまり良いものではないと思い、一から作り直した方がいい!と思うなら
 最後のコメントに  『作り直し』  と書いてください。
 まだ、いけると思うなら『再トライ』 と書いてくださると助かります。


  画像

Mist

Re:サウンドノベル風文字列表示法

#2

投稿記事 by Mist » 15年前

> ・会話(内容)をすべて表示しない。
// 1文字描画
した後に画面に反映している(ScreenFlip)ところが見当たらないのですが。

> ・改行しない

関数がコメントアウトされているから当然な気もしますけど。
if(Moji=='/'){    // 改行文字
                // 改行処理および参照文字位置を一つ進める
                //Kaigyou() ;
                CP++;
                }
> ENDflgを立てても、綺麗に次の関数に行かない

// 終了フラグが1だったら終了する
がwhileループの外にあるからじゃないですか?
return_kaiwaを2にするところがループ内に無いからループを終了できないのでしょう。

while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
がループの外なのも変と思いますが。

> ・その他

定期的にProcessMessageを呼び出してないのは大問題。
一応、WaitTimerとWaitKey内で実行されるけどそう意図して作ったとは思えないんですけど。


作り直すかどうかを悩む前に、もう少し自分が作ったプログラムについて理解をしないと意味無いように思いました。(作り以前の問題)
足りないのはソースの流れを読む力だと思いますよ。

kazuoni

Re:サウンドノベル風文字列表示法

#3

投稿記事 by kazuoni » 15年前

> 自分の担当は、『サウンドノベル風文字列表示』

ということは、他のイベント担当がほかにもいるわけですよね?
関数culeは関数ClearDrawScreenを使っていますが、
他の方が担当している部分が関数culeの前にあり、LoadGraphScreen()が書かれていたら
それは消えてしまいます。(関数LoadGraphScreenは処理が重いってことも頭の片隅に。)
また、関数GetHitKeyStateAllは毎ループに一回でOKです。

自分が感じたたのは、ひとつのプロジェクトの一関数としては
関数が独立しすぎなのでは?っと思いました。


> ※その他の願い

みんなとプロジェクト全体についてディスカッション 画像

電気屋

回答について

#4

投稿記事 by 電気屋 » 15年前

どうも、回答ありがとうございます。
いただいた回答から、自分のプログラムを見直したのですが、どうもうまくいきません。
また、言い訳になるかもしれませんが。
プログラムに所々変なところがあるのは、うまく動かなかったので所々いじった残りです。
また、プログラムの結合度を低くする目的と見やすくするために関数を独立化させました。乗せてあるプログラムは一応皆さんに意見をもらうために簡易化したものなので、元々から独立化していたわけではありません。
プログラムがループ外にあったのは自分のミスです。所々のミスはプログラムを移動させたところのミスなので、間違えをそのまま乗せたこと、どうもすみませんでした。


意見をもらっている側なのに勝手なことを書いて申し訳ありません。
どうか気を悪くしないでください。




一つ一つバグを化片付けたいと思います。

まず、改行のところからです。

コメントアウトがされているから

と書かれていましたが、これは見直しをしたときの残骸です実際は


if(Moji=='/'){ // 改行文字
// 改行処理および参照文字位置を一つ進める
Kaigyou() ;
CP++;
}


このようになっています。しかし、このプログラムを実行すると


    『名前』→’キー待ち’→『どうも、テストです』→三行目の『名前』→『またテストです』

と表記されます。
文を ":名前/どうも、テストです/仮名として表示しています",
と一行にまとめても同じ結果が出てきます。

また'/’を名前後だけにしたら、
///////////////////////////////
名前
どうも、テストです仮名とし
///////////////////////////////
と表示されます。


自分は、名前のところでは改行されていますし、'/'の文字表記もされていませんので、うまくいっているのだと思っています。しかしその後の改行がうまくいっていないと思っています。サンプルのプログラムを真似て作っていたのですが、うまく動きません。サンプルに当てはめるとうまく動きます。何ででしょう?
どうか回答お願いします。

画像

softya

Re:回答について

#5

投稿記事 by softya » 15年前

とりあえず動かして問題を確認してみたいのですが、最新のコードを動く形(main付き)で添付してもらえませんか。

電気屋

貼り付け方がわかりません。

#6

投稿記事 by 電気屋 » 15年前

すみません。以前圧縮形式で乗せようとしてできなかったので
コードの貼り付け方はtxet形式でいいですか?

一応、明日にはテキスト形式にして貼り付けときます。

今のプログラムは、友達と一緒にして作っているので、結合度と容量がおおきので

softya

Re:貼り付け方がわかりません。

#7

投稿記事 by softya » 15年前

動くコードならテキストでも構いませんよ。
ファイルはzipなら添付出来るはずです。

SooA

Re:貼り付け方がわかりません。

#8

投稿記事 by SooA » 15年前

>まず、改行のところからです。
添付されているソースでは '/'、'E'、':'、else{ } の分岐で、
else { } が処理された後に '\0' の判定が行われています。
正しく表示できないのはそのためだと思います。


>※その他の願い
まずは単体で動作するプログラムを作ってみてはどうでしょう。

電気屋

Re:貼り付け方がわかりません。

#9

投稿記事 by 電気屋 » 15年前

約束のプログラムです。時間がなく、一応動きますが
"E"の後のループや、その他の不具合がありますが、改行のところだけ見てください。
一応原本と、結合度の低いやつと二つ張ります。

SooA

Re:貼り付け方がわかりません。

#10

投稿記事 by SooA » 15年前

>改行のところだけ見てください。
ぱっと見て足りないトコ
} else
    // 参照文字列の終端まで行っていたら参照文字列を進める
    if( String[ SP ][ CP ] == '\0' )
    {
        WaitKey() ;
        SP ++ ;
        CP = 0 ;
    }
画像

SooA

Re:貼り付け方がわかりません。

#11

投稿記事 by SooA » 15年前

追記
ScreenFlip(); が Kaigyou(); にしかないので
改行が行われるまで描画が反映されません。

softya

Re:サウンドノベル風文字列表示法

#12

投稿記事 by softya » 15年前

思いっきり変更させてもらいました。
根本的にメインループのありかたを見直した方が良いと思います。
それにウィンドウズ・アプリとして、トンデモナイ事をあちこちでしてました。
これでは、終了したいときに終了しませんし、起動したままウィンドウズの終了をした場合に支障が出ます。

[注意点]
・ウィンドウズ・アプリは、必ずProcessMessage()を必ず周期的に呼び出さなくてはいけません。
・ScreenFlip()をしないと画面は更新されません。
・無限ループに近い方法でタイミング制御をしてはいけません。
・メインループを複数持つと終了処理で困るので、出来るだけ1つにまとめましょう。
・グローベル変数が多すぎるので、構造体にまとめた方がよいでしょう。

直したところや問題のあるところは★コメントで書き込んであります。

電気屋

お礼

#13

投稿記事 by 電気屋 » 15年前

ありがとうございます。
大変お騒がせしました。いただいたプログラムから、もう一度やり直してみます。
そのときにまた、お願いします。

電気屋

Re:お礼

#14

投稿記事 by 電気屋 » 15年前

プログラムをいただいて作り直した結果、バグもなくきれいに動くようになりました。
どうも、ありがとうございました。

閉鎖

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