サウンドノベル風のテキスト表示について
-
おじゃま
サウンドノベル風のテキスト表示について
はじめまして。
最近、DXライブラリを使ってゲームを作り始めたのですが、敵のセリフのシーン、つまりは、メッセージを描画するところで躓いてます。
基本コードとしては、http://dixq.net/g/の「ゲームプログラムの基本骨格」にhttp ... てる形になっています。
ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。
ClearDrawScreenの位置を動かせばうまくいくのかもしれませんが、ほかのプログラムがうまく動いているので、できれば動かしたくありません。
そこで私も考えたのですが、文字が消える前にその表示されている画面そのものを画像として変数か何かに格納できないかと思いました。
それができれば、
1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
ということができると思ったんです。
ですが、DXライブラリの関数を調べても表示画面を変数などに格納する関数が見つかりません。
そこで質問なんですが、DXライブラリでは表示されている画面を変数などに格納する関数というのはやはりないのでしょうか?
ないのであれば、それに近い形とる方法はないのでしょうか?
どなたか教えてください。
最近、DXライブラリを使ってゲームを作り始めたのですが、敵のセリフのシーン、つまりは、メッセージを描画するところで躓いてます。
基本コードとしては、http://dixq.net/g/の「ゲームプログラムの基本骨格」にhttp ... てる形になっています。
ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。
ClearDrawScreenの位置を動かせばうまくいくのかもしれませんが、ほかのプログラムがうまく動いているので、できれば動かしたくありません。
そこで私も考えたのですが、文字が消える前にその表示されている画面そのものを画像として変数か何かに格納できないかと思いました。
それができれば、
1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
ということができると思ったんです。
ですが、DXライブラリの関数を調べても表示画面を変数などに格納する関数が見つかりません。
そこで質問なんですが、DXライブラリでは表示されている画面を変数などに格納する関数というのはやはりないのでしょうか?
ないのであれば、それに近い形とる方法はないのでしょうか?
どなたか教えてください。
-
hidden
Re: サウンドノベル風のテキスト表示について
GetDrawScreenGraphあたりを使えば考えていらっしゃる動作はできる気がしますが
なんかやり方自体に問題があるような気がしてならないです。
ClearDrawScreenの位置より文字を表示する関数の位置のほうに問題がありませんか?
ソースコードを貼ってみたほうがいいと思います。
なんかやり方自体に問題があるような気がしてならないです。
ClearDrawScreenの位置より文字を表示する関数の位置のほうに問題がありませんか?
ソースコードを貼ってみたほうがいいと思います。
-
hidden
Re: サウンドノベル風のテキスト表示について
連投になってしまって申し訳ないのですが、
どんな状態になっていて何が問題なのかわかりにくいので、
どんな状態になっていて何が問題なのかわかりにくいので、
についてどんな動作をしてしまって上手くいかないのかを書いていただけるといいと思います。おじゃま さんが書きました: ですが、ここで問題なのが、main関数のwhile文の条件にClearDrawScreenが入っていることにより文字が表示されてもすぐ消えてしまいうまく文として表示できません。
Re: サウンドノベル風のテキスト表示について
1文字目表示→おじゃま さんが書きました:1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~2文字目まで表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~3文字目まで表示→
…
と表示する文字数を増やしていくようにします。
特にバックバッファを使う場合は全部描き直すのが基本です。
#PC以外だと描画内容をキャプチャできるプラットフォームってあんまり無いんですよね。
-
おじゃま
Re: サウンドノベル風のテキスト表示について
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]
すいません
わかりにくいところがあるかもしれませんが一応今の流れはこんな感じになっています。
呼び出しと一文字ずつの表示がうまくいっているので省略しているところには問題がないと思います。
これでも何をやっているか分からないようでしたら恥ずかしいですがソースをそのまま載せます。
Re: サウンドノベル風のテキスト表示について
ISLeさんのアドバイスの通り、
1文字目、2文字目を個別に表示するのではなく
2文字目を表示するときはその前の1文字目も描画するようにすべきです。
例えば、「あいうえお」と表示するのであれば、
1「あ」を描画
2「あい」を描画
3「あいう」を描画
4「あいうえ」を描画
5「あいうえお」を描画
というようになります。
そうすれば、ClearDrawScreen()されても1文字目が消えることはありません。
1文字目、2文字目を個別に表示するのではなく
2文字目を表示するときはその前の1文字目も描画するようにすべきです。
例えば、「あいうえお」と表示するのであれば、
1「あ」を描画
2「あい」を描画
3「あいう」を描画
4「あいうえ」を描画
5「あいうえお」を描画
というようになります。
そうすれば、ClearDrawScreen()されても1文字目が消えることはありません。
-
おじゃま
Re: サウンドノベル風のテキスト表示について
連投すいませんISLe さんが書きました:1文字目表示→おじゃま さんが書きました:1文字目表示→表示画面を変数に格納→ClearDrawScreen→whileによって上から戻ってくる→変数に格納されている画像を表示→2文字目表示→表示画面を格納・・・
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~2文字目まで表示→
ClearDrawScreen→
whileによって上から戻ってくる→
1文字目~3文字目まで表示→
…
と表示する文字数を増やしていくようにします。
特にバックバッファを使う場合は全部描き直すのが基本です。
#PC以外だと描画内容をキャプチャできるプラットフォームってあんまり無いんですよね。
もう一方の方の回答について返答するのを忘れてました。
↑のようにご指摘いただいたのですが、
これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
具体的に方法を教えていただけますか?
Re: サウンドノベル風のテキスト表示について
おじゃまさんがその方法(もうひとつ配列を用意)で出来ると考えるのでしたら、おじゃま さんが書きました: これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
実際にその方法で組んでみたらどうでしょうか?
その上で別に効率的な方法があるかどうか調べればいいかと思います。
-
おじゃま
Re: サウンドノベル風のテキスト表示について
h2so5 さんが書きました:おじゃまさんがその方法(もうひとつ配列を用意)で出来ると考えるのでしたら、おじゃま さんが書きました: これは、もうひとつ配列を用意して、そこにこれまでに表示した文字を格納して、それを毎回表示するという形になるんですかね?
それともほかになにか別のやり方があるんでしょうか?
実際にその方法で組んでみたらどうでしょうか?
その上で別に効率的な方法があるかどうか調べればいいかと思います。
-
おじゃま
Re: サウンドノベル風のテキスト表示について
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: サウンドノベル風のテキスト表示について
ここのサイトの方法は参考になりませんか?
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。