トップページ > 記事閲覧
文字の描写
名前:はちみつ 日時: 2018/05/13 22:01

ノベルゲームを作ろうと思いまして、よくあるぴこぴこって音なりながら一文字ずつ描写されてくやつあるじゃないですか? あれがうまくできなくて困ってます。 いろいろ考えこんなかんじの関数をつくったんですよ void talk(int x, int y,char t[]) { int color = GetColor(0, 0, 0); for (int i = 0; t[i]!='\0'; i=i+2) { DrawFormatString(x, y, color, "%c", t[i]); x += 10; } } 結果は半角英語だと一文字おきに表示されるのに平仮名は何も表示されませんなぜでしょう? ちなみにiに+2してるのは平仮名を表示させたいからです。 本で調べたら平仮名や漢字はマルチバイト文字とかで配列の二つ分を使うと書いてあったので+2にしました。 うまく表示できるようになったら一文字ずつの表示スピードを調節して音を追加するつもりです。
メンテ

Page: 1 |

Re: 文字の描写 ( No.1 )
名前:PPM 日時:2018/05/13 23:28

超適当コードですが、なぜこれなら表示されるかをぜひ考えてみてください。 #include "DxLib.h" void talk(int x, int y, char t[]) { unsigned int color = DxLib::GetColor(255, 255, 255); for (int i = 0; t[i] != '\0'; i++) { int nSize = DxLib::GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, t + i); if (nSize == 1) { DxLib::DrawFormatString(x, y, color, "%c", t[i]); x += 10; } else { DxLib::DrawFormatString(x, y, color, "%c%c", t[i], t[i+1]); x += 20; i++; } } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { DxLib::ChangeWindowMode(true); DxLib::SetWindowSize(640, 480); if (DxLib::DxLib_Init() == -1) return -1; DxLib::SetDrawScreen(DX_SCREEN_BACK); while (!DxLib::ProcessMessage()) { DxLib::ClearDrawScreen(); talk(0, 0, "ABCD高校出身です."); DxLib::ScreenFlip(); } return DxLib::DxLib_End(); }
メンテ
Re: 文字の描写 ( No.2 )
名前:はちみつ 日時:2018/05/14 00:59

おかげさまで文字はうまく表示されるようになりました! しかし今度は一文字ずつ少し遅れるように表示させたいのですがうまくいきません。 先ほど教えていただいたのをもとにこのようにプログラムを書いてみました。 void talk(int x, int y,char t[]) { int color = GetColor(0, 0, 0); int count = 0; for (int i = 0; t[i]!='\0'; i++) { int Size = GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS,t+i); if (Size == 1&&count%10==0) { DrawFormatString(x, y, color, "%c", t[i]); x += 17; } else if(Size!=1&&count%10==0) { DrawFormatString(x, y, color, "%c%c", t[i],t[i+1]); x += 17; i++; } else { i--; } count++; } カウントで文字を書くタイミングをずらそうと思ったのですが文字はちゃんと表示されるのにすべて同時に表示されてしまいます。 プログラミング初心者なもので何かとうまくいかないことが多いのでよろしくお願いします。
メンテ
Re: 文字の描写 ( No.3 )
名前:yumetodo 日時:2018/05/14 09:12

for一回ごとに適当時間sleepすることと、ProcessMessageを呼び出すようにしましょう。
メンテ
Re: 文字の描写 ( No.4 )
名前:はちみつ 日時:2018/05/14 14:11

ProcessMessageをかいたらうまくいきました!! 一応今後のためにきいておきたいのですがProcessMessageとはいったいどういう関数なのでしょう? 調べてもとりあえず書いておけって感じなんですけど気になります。 今回の場合ゲームのメインループのとこにもProcessMessageをかいてあったのですがそれではうまくいきませんでした。 なのでどういうときに書いたらいいかも教えてほしいです。
メンテ
Re: 文字の描写 ( No.5 )
名前:PPM 日時:2018/05/15 19:59

実際に while (!ProcessMessage()) { の行を while (TRUE) { とでも書き換えてみてください。 一見、普通に動いているように見えますが、例えばウィンドウのタイトルバーをクリックして移動させようと 思っても反応しないと思います。[×]をクリックして閉じようにも、反応しません。 という感じで、普段あまり意識しないあれやこれやの処理を片付けてくれる処理です。 DXライブラリではBGMのループ処理などもこの関数で実施するので定期的に呼ばないといけません。 ちなみに、今までの方法だと、文字を表示することしかできません。文字を表示させながら背景も動かしたい… 例えば背景の葉っぱがゆらゆら揺れている…とか。なんて場合にどうすればいいか的な例を作りました。 文字が0.5秒ごとに書かれますが、赤い針はずっとくるくる回ります。 ※なお、ProcessMessage()を一か所ですませる書き方をしています。 #include "DxLib.h" #include <math.h> void talk2(int x, int y, char t[], int nCount) { int n = nCount / 30; // 1/60秒が30コマ、つまり0.5秒ごとに1文字増やす int color = DxLib::GetColor(0, 0, 0); for (int i = 0; i < n + 1 && t[i] != '\0'; i++) { int Size = DxLib::GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, t + i); if (Size == 1) { DxLib::DrawFormatString(x, y, color, "%c", t[i]); x += 9; } else { DxLib::DrawFormatString(x, y, color, "%c%c", t[i], t[i + 1]); x += 17; i++; n++; } } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { DxLib::ChangeWindowMode(true); DxLib::SetWindowSize(640, 480); if (DxLib::DxLib_Init() == -1) return -1; DxLib::SetDrawScreen(DX_SCREEN_BACK); int count = 0; while (!DxLib::ProcessMessage()) { DxLib::ClearDrawScreen(); DxLib::DrawBox(0, 0, 640, 480, DxLib::GetColor(255, 255, 255), TRUE); double x2, y2, rad = (2.0 * DX_PI / 360.0) * (double)(count % 360); x2 = 250.0 * (cos(rad) - sin(rad)) + 320.0; y2 = -250.0 * (sin(rad) + cos(rad)) + 240.0; DxLib::DrawLine(320, 240, (int)x2, (int)y2, DxLib::GetColor(255, 0, 0), 5); // 線をくるくる talk2(0, 0, "OpenGLとDirectXが統合されてFahrenheitになるなんて話もありましたね(過去形)", count); DxLib::ScreenFlip(); if (++count > (50 + 3) * 30) count = 0; } return DxLib::DxLib_End(); } 2018/05/15 ちょっと変更
メンテ
Re: 文字の描写 ( No.6 )
名前:はちみつ(解決) 日時:2018/05/15 00:56

なるほどProcessMessgeの大切さがわかりました!! ありがとうございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存