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の大切さがわかりました!!
ありがとうございました!
|
|