サウンドノベル風のテキスト表示について

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

サウンドノベル風のテキスト表示について

#1

投稿記事 by おじゃま » 14年前

はじめまして。

最近、DXライブラリを使ってゲームを作り始めたのですが、敵のセリフのシーン、つまりは、メッセージを描画するところで躓いてます。
基本コードとしては、http://dixq.net/g/の「ゲームプログラムの基本骨格」にhttp ... てる形になっています

ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。

ClearDrawScreenの位置を動かせばうまくいくのかもしれませんが、ほかのプログラムがうまく動いているので、できれば動かしたくありません。

そこで私も考えたのですが、文字が消える前にその表示されている画面そのものを画像として変数か何かに格納できないかと思いました。
それができれば、 

1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・

ということができると思ったんです。
ですが、DXライブラリの関数を調べても表示画面を変数などに格納する関数が見つかりません。

そこで質問なんですが、DXライブラリでは表示されている画面を変数などに格納する関数というのはやはりないのでしょうか?
ないのであれば、それに近い形とる方法はないのでしょうか?

どなたか教えてください。

hidden

Re: サウンドノベル風のテキスト表示について

#2

投稿記事 by hidden » 14年前

GetDrawScreenGraphあたりを使えば考えていらっしゃる動作はできる気がしますが
なんかやり方自体に問題があるような気がしてならないです。

ClearDrawScreenの位置より文字を表示する関数の位置のほうに問題がありませんか?
ソースコードを貼ってみたほうがいいと思います。

hidden

Re: サウンドノベル風のテキスト表示について

#3

投稿記事 by hidden » 14年前

連投になってしまって申し訳ないのですが、
どんな状態になっていて何が問題なのかわかりにくいので、
おじゃま さんが書きました: ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。
についてどんな動作をしてしまって上手くいかないのかを書いていただけるといいと思います。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: サウンドノベル風のテキスト表示について

#4

投稿記事 by ISLe » 14年前

おじゃま さんが書きました:1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
1文字目表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~2文字目まで表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~3文字目まで表示→

と表示する文字数を増やしていくようにします。
特にバックバッファを使う場合は全部描き直すのが基本です。

#PC以外だと描画内容をキャプチャできるプラットフォームってあんまり無いんですよね。

おじゃま

Re: サウンドノベル風のテキスト表示について

#5

投稿記事 by おじゃま » 14年前

hidden さんが書きました:連投になってしまって申し訳ないのですが、
どんな状態になっていて何が問題なのかわかりにくいので、
おじゃま さんが書きました: ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。
についてどんな動作をしてしまって上手くいかないのかを書いていただけるといいと思います。

このような質問に返信いただきありがとうございます。
↑のような返信をいただきましたので、少しどのような動作をしているか書かせていただきたいと思います。

下はゲームのメインループです。
ほんとはソースコードをそのまま書いた方がいいのかも知れませんが、なにぶん初心者なので、人にお見せできるようなきれいな書き方になっていないので言葉で説明させていただきます。


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && flag != 0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存    ↑ESCが押されていない エンドフラグ

 
if(stage == 0){
ここはタイトル画面の表示等の関数が入ってます。
         (title.cppから呼び出し)
     }


     if(stage == 1){
問題はここです!
        ステージ1なのでstage1.cppから画面を表示する関数を呼び出しています。
        問題のメッセージの関数はここで呼び出している関数の中で
        さらにmessage.cppから呼び出しています。
 
        呼び出しそのものは成功していて1文字表示されます。
        ですが↑のwhile文の中で画面がクリアされてしまい、
        次にこの関数が呼び出されたときには1文字目が消えていて
        2文字目だけが2文字目の場所に表示されます。

}



     ScreenFlip(); // 裏画面を表に

}

DxLib_End();
return 0;
}
[/code]


すいません
わかりにくいところがあるかもしれませんが一応今の流れはこんな感じになっています。
呼び出しと一文字ずつの表示がうまくいっているので省略しているところには問題がないと思います。

これでも何をやっているか分からないようでしたら恥ずかしいですがソースをそのまま載せます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: サウンドノベル風のテキスト表示について

#6

投稿記事 by h2so5 » 14年前

ISLeさんのアドバイスの通り、
1文字目、2文字目を個別に表示するのではなく
2文字目を表示するときはその前の1文字目も描画するようにすべきです。

例えば、「あいうえお」と表示するのであれば、
1「あ」を描画
2「あい」を描画
3「あいう」を描画
4「あいうえ」を描画
5「あいうえお」を描画
というようになります。

そうすれば、ClearDrawScreen()されても1文字目が消えることはありません。

おじゃま

Re: サウンドノベル風のテキスト表示について

#7

投稿記事 by おじゃま » 14年前

ISLe さんが書きました:
おじゃま さんが書きました:1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
1文字目表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~2文字目まで表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~3文字目まで表示→

と表示する文字数を増やしていくようにします。
特にバックバッファを使う場合は全部描き直すのが基本です。

#PC以外だと描画内容をキャプチャできるプラットフォームってあんまり無いんですよね。
連投すいません
もう一方の方の回答について返答するのを忘れてました。

↑のようにご指摘いただいたのですが、
これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
具体的に方法を教えていただけますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: サウンドノベル風のテキスト表示について

#8

投稿記事 by h2so5 » 14年前

おじゃま さんが書きました: これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
おじゃまさんがその方法(もうひとつ配列を用意)で出来ると考えるのでしたら、
実際にその方法で組んでみたらどうでしょうか?

その上で別に効率的な方法があるかどうか調べればいいかと思います。

おじゃま

Re: サウンドノベル風のテキスト表示について

#9

投稿記事 by おじゃま » 14年前

h2so5 さんが書きました:
おじゃま さんが書きました: これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
おじゃまさんがその方法(もうひとつ配列を用意)で出来ると考えるのでしたら、
実際にその方法で組んでみたらどうでしょうか?

その上で別に効率的な方法があるかどうか調べればいいかと思います。

おじゃま

Re: サウンドノベル風のテキスト表示について

#10

投稿記事 by おじゃま » 14年前

すみません
投稿ミスです。

おじゃま

Re: サウンドノベル風のテキスト表示について

#11

投稿記事 by おじゃま » 14年前

h2so5 さんが書きました:
おじゃま さんが書きました: これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
おじゃまさんがその方法(もうひとつ配列を用意)で出来ると考えるのでしたら、
実際にその方法で組んでみたらどうでしょうか?

その上で別に効率的な方法があるかどうか調べればいいかと思います。

実は、別の配列に格納するとという方法はすでに一度試してみたのですが、
なかなか思ったように動いてくれなくて結果初めに言ったような表示画面を取得する関数を探しはじめたました。

私のソースコードでは他ファイルの関数を読み込むことが多いので、その都合上、変数はほぼすべてポインタで渡しています。

おそらく、配列の渡し方とと受け取り方が悪いんだと思いますが、

コード:

//main.cpp

static char message_temp[256][256]; // メッセージを一時的に

while{

// message.cppからメッセージを表示する関数を呼び出し
message(&message_temp[][256]);

ScreenFlip();
}

//message.cpp

message(char message_temp[][256]){

メッセージの表示とmessage_tempへの格納

}

というふうな感じに書いています。
ですがうまくいきません。
一文字目は”待”なのですが、message_tempには”メ”が入っていて、2文字目以降は格納されません。

これは、やはり関数への渡しと受け取りがうまくいってないからなのでしょうか?
どなたかご返答いただけたけたら助かります。

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

Re: サウンドノベル風のテキスト表示について

#12

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

ここのサイトの方法は参考になりませんか?

「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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