以下の三つのプログラムはkazuma-sという方に書いていただいたクラス、構造体、配列のプログラムです。
どれも文字を一文字ずつ描画するためのプログラムです。
まず**一つ目の質問です。**クラスで書かれたプログラムについてです。
クラスで書かれたプログラムのclass Str の中にif文でposなどの変数を扱って場合はエラーはないですが、
class Strの外部で(while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())の{}の中に)class Strの変数posを扱うとエラーが出ます。調べるとアクセスする必要があるとのことなのですが、
書き方がわかりません。
**二つ目の質問です。**構造体で書かれたプログラムについてです。
こちらがクラスです。一つ目の質問と似ているのですが、構造体struct Strの中に書いてある変数posの中身を
関数DrawFormatStringを用いて描画しようとしたのですが、while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())の中にDrawFormatString(300, 300, Green, "%d", s->pos);を書いたのですが、sが定義されていないとエラーが出ます。構造体の変数から作った関数void drawStringの外部のwhile (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())の{}の中で変数posを扱うにはどのように書けばいいのでしょうか。
**最後の質問です。**配列で書かれたプログラムについてです。
関数の中以外で(while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())の{}の中でpos[i]を使うにはどのように書けばいいでしょうか。他にも原因は同じですが、DrawFormatString(300, 300, Green, "%d", i);と書いてみたのですが、変数iが定義されていないとでてエラーになります。
こちらがクラスのプログラムです。
#include <DxLib.h> class Str { const char* str; int frame; int pos; int count; public: void setMember(int iMember) { pos = iMember; } Str(const char* str, int frame) : str(str), frame(frame), pos(0), count(0) {} void drawString(int x, int y, int color) { if (count == 0 && str[pos]) pos += 1 + IsDBCSLeadByte(str[pos]); if (++count == frame) count = 0; DrawFormatString(x, y, color, "%.*s", pos, str);//ポインタの配列としてstrを*sとして、[]の中のposは%としたのだ。 } void reset() { pos = count = 0; } }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetFontSize(25); //サイズを64に変更 ??? SetFontThickness(10); //太さを8に変更 ??? ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォント SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); SetGraphMode(780, 680, 32); // 画面サイズは最大の780*680にしておく SetWindowSize(780, 680); // 最初は 640x480 にしておく ??? int Green = GetColor(0, 255, 0); Str str1("あいうabc", 50); // 6文字を 50フレームごとに 1文字追加 // 全部で 300フレーム(5秒) int t = 0; while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { str1.drawString(100, 500, Green); if (++t == 60 * 6) { t = 0; str1.reset(); } // 6秒ごとにリセット } DxLib_End(); // DXライブラリ終了処理 return 0; }
こちらが構造体です。
#include <DxLib.h> struct Str { const char *str; int frame; int pos; int count; }; void drawString(struct Str *s, int x, int y, int color) { char c = s->str[s->pos]; if (s->count == 0 && c != '\0') s->pos += IsDBCSLeadByte(c) ? 2 : 1; if (++s->count == s->frame) s->count = 0; DrawFormatString(x, y, color, "%.*s", s->pos, s->str); } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetFontSize(25); //サイズを64に変更 ??? SetFontThickness(10); //太さを8に変更 ??? ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォント SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); int Green = GetColor(0, 255, 0); struct Str str1 = { "あいうabc", 50, 0, 0 }; int t = 0; while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { drawString(&str1, 100, 500, Green); if (++t == 60 * 6) { t = 0; str1.count = str1.pos = 0; } } DxLib_End(); // DXライブラリ終了処理 return 0; }
こちらが配列のプログラムです。
#include <DxLib.h> const char *str[3] = { "あいうabc", "0123456789", "ABCDEFG" }; int frame[3] = { 50, 30, 40 }; int pos[3]; int count[3]; void drawString(int i, int x, int y, int color) { char c = str[i][pos[i]]; if (count[i] == 0 && c != '\0') pos[i] += IsDBCSLeadByte(c) ? 2 : 1; if (++count[i] == frame[i]) count[i] = 0; DrawFormatString(x, y, color, "%.*s", pos[i], str[i]); } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetFontSize(25); //サイズを64に変更 ??? SetFontThickness(10); //太さを8に変更 ??? ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォント SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); int Green = GetColor(0, 255, 0); int Yellow = GetColor(255, 255, 0); int White = GetColor(255, 255, 255); int t = 0; while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { drawString(0, 100, 500, Green); drawString(1, 100, 530, Yellow); drawString(2, 500, 530, White); if (++t == 6*60) { t = 0; for (int i = 0; i < 3; i++) pos[i] = count[i] = 0; } } DxLib_End(); // DXライブラリ終了処理 return 0; }
編集
構造体のプログラムに関してなのですが
char c = s->str[s->pos];//ポインタsに入っているstr[pos]の文字のデータが一文字ずつcに入る if (s->count == 0 && c != '\0')//その時にcountが0でかつcに入る文字が¥0(文字列の最後の部分\0)でない、すなわち文字ならば日本語一文字は2バイトなので、 s->pos += IsDBCSLeadByte(c) ? 2 : 1;//posに2バイトを足す、違う場合は¥0(\0)なので1バイト加える。(¥0(\0)は1バイトなので。) if (++s->count == s->frame) s->count = 0;//一文字ずつ出力する間隔を処理する変数countと間隔の最大値を表すframeが等しくなったら、countを0にする DrawFormatString(x, y, color, "%.*s", s->pos, s->str);//関数drawStringの引数として関数DrawFormatStringの引数を利用する
の部分に関してわからないことがあります。
最後の部分のs->pos, s->strの中身を表すために"%.*s"と書いていますが、なぜ"%.*s"のように書けるのでしょうか。
もう一つ、配列のプログラムに関して
const char* str[3] = { "あいうabc", "0123456789", "ABCDEFG" };
ポインタを使用して右の三つの文字列を配列に入れるまではわかるのですが、**なぜポインタを使用して、constを付けたのかわかりません。**どうか理由を教えてください。
編集後のクラスのプログラム
#include <DxLib.h> class Str { const char* str; int frame; int pos; int count; public: int position() const { return pos; } // コレ追加 Str(const char* str, int frame) : str(str), frame(frame), pos(0), count(0) {} void drawString(int x, int y, int color) { if (count == 0 && str[pos]) pos += 1 + IsDBCSLeadByte(str[pos]); if (++count == frame) count = 0; DrawFormatString(x, y, color, "%.*s", pos, str); } void reset() { pos = count = 0; } }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetFontSize(25); //サイズを64に変更 ??? SetFontThickness(10); //太さを8に変更 ??? ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォント SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); SetGraphMode(780, 680, 32); // 画面サイズは最大の780*680にしておく SetWindowSize(780, 680); // 最初は 640x480 にしておく ??? int Green = GetColor(0, 255, 0); Str str1("あいうabc", 50); // 6文字を 50フレームごとに 1文字追加 // 全部で 300フレーム(5秒) int t = 0; while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { str1.drawString(100, 500, Green); if (++t == 60 * 6) { t = 0; str1.reset(); } // 6秒ごとにリセット DrawFormatString(300, 300, Green, "%d",pos);//これを追加した } DxLib_End(); // DXライブラリ終了処理 return 0; }
編集後の解決したクラスのプログラム
#include <DxLib.h> class Str { const char* str; int frame; int pos; int count; public: int position() const { return pos; } // コレ追加 void setMember(int iMember) { pos = iMember; } Str(const char* str, int frame) : str(str), frame(frame), pos(0), count(0) {} void drawString(int x, int y, int color) { if (count == 0 && str[pos]) pos += 1 + IsDBCSLeadByte(str[pos]); if (++count == frame) count = 0; DrawFormatString(x, y, color, "%.*s", pos, str);//ポインタの配列としてstrを*sとして、[]の中のposは%としたのだ。 } void reset() { pos = count = 0; } }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetFontSize(25); //サイズを64に変更 ??? SetFontThickness(10); //太さを8に変更 ??? ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォント SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); SetGraphMode(780, 680, 32); // 画面サイズは最大の780*680にしておく SetWindowSize(780, 680); // 最初は 640x480 にしておく ??? int Green = GetColor(0, 255, 0); Str str1("あいうabc", 50); // 6文字を 50フレームごとに 1文字追加 // 全部で 300フレーム(5秒) int t = 0; while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { str1.drawString(100, 500, Green); DrawFormatString(300, 100, Green, "%d", str1.position());//Str str1("あいうabc", 50);に関しての関数position()のposについて描画できた。 if (++t == 60 * 6) { t = 0; str1.reset(); } // 6秒ごとにリセット } DxLib_End(); // DXライブラリ終了処理 return 0; }
編集後の配列の解決したプログラム
文字数制限があるのでこちらのサイトに書きました。
配列の解決したプログラム
編集後の構造体の解決したプログラム
構造体の解決したプログラム
回答4件
あなたの回答
tips
プレビュー