DrawStringToHandleでの全角文字の表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
放浪中
記事: 12
登録日時: 10年前

DrawStringToHandleでの全角文字の表示について

#1

投稿記事 by 放浪中 » 9年前

DrawStringToHandle関数について

 以前,この掲示板で質問した者です。現在,DxLibでRPGを制作しているのですが,名前入力画面でつまずいてしまいました。
かなを50音順に表示することはできたのですが,その際に処理が重くなってしまいます(fpsが27前後)。以下がソースコードになります。

コード:

//文字・文字列表示
void	showCharStrToName(int	toNameState, int	nowShowChar){

	const	int sa = 1;
	const	int	stringNum = 7;

	const	char	strAtcName[64] = { "主人公の名前を決めてください。" };
	const	char	strSelectMode[][5] = { "かな", "カナ", "漢字", "英数", "消去", "戻る", "OK!" };
	const	char	chKana1ToName[][3] = { 
										   "あ", "い", "う", "え", "お",
										   "か", "き", "く", "け", "こ",
										   "さ", "し", "す", "せ", "そ",
										   "た", "ち", "つ", "て", "と",
										   "な", "に", "ぬ", "ね", "の",
										   "は", "ひ", "ふ", "へ", "ほ",
										   "ま", "み", "む", "め", "も",
										   "や", "ゆ", "よ", "わ", "ん",
										   "ら", "り", "る", "れ", "ろ",
										   "が", "ぎ", "ぐ", "げ", "ご",
										   "ざ", "じ", "す", "ぜ", "ぞ",
										   "だ", "ぢ", "づ", "で", "ど",
										   "ば", "び", "ぶ", "べ", "ぼ",
										   "ぱ", "ぴ", "ぷ", "ぺ", "ぽ",
										   "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
										   "っ", "ゃ", "ゅ", "ょ", "ゎ",
										   "を", " ", "ー", "=", "~",
										   "¥", "#", "$", "%", "&"
										 };

	/*static	char	chKana2ToName[][3] = {
										   "が", "ぎ", "ぐ", "げ", "ご",
										   "ざ", "じ", "ず", "ぜ", "ぞ",
										   "だ", "ぢ", "づ", "で", "ど",
										   "ば", "び", "ぶ", "べ", "ぼ",
										   "ぱ", "ぴ", "ぷ", "ぺ", "ぽ",
										   "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
										   "っ", "ゃ", "ゅ", "ょ", "ゎ",
										   "を", " ", "ー", "=", "~",
										   "¥", "#", "$", "%", "&"
										 };*/

	static	int	mojiColor[] = { CHAR_COLOR2, CHAR_COLOR1 };

	switch (toNameState){

		case	0:
			for (int i = 0; i < 2; i++){
				DrawStringToHandle(100 + sa - i, 80 + sa - i, strAtcName, mojiColor[i], Font[2].font);

				for (int j = 0; j < stringNum; j++){
					DrawStringToHandle(100 + sa - i, (192 + j * 32) + sa - i, strSelectMode[j], mojiColor[i], Font[2].font);
				}

				if (nowShowChar == 0){	//ひらがな表示

					int	num;

					for (int j = 0; j < 9; j++){
						for (int k = 0; k < 5; k++){
							num = j * 5 + k;
							DrawStringToHandle((180 + k * 32) + sa - i, (192 + j * 24) + sa - i, chKana1ToName[num], mojiColor[i], Font[2].font);
							DrawStringToHandle((368 + k * 32) + sa - i, (192 + j * 24) + sa - i, chKana1ToName[num + 45], mojiColor[i], Font[2].font);
						}	
					}

				}
			}

			break;
	
	}

	//DrawLine(182,0,182,480,COLOR_BLACK);
	//DrawLine(0, 360, 640, 360, COLOR_BLACK);

}
 このまま実行すると処理が重くなってしまいます。しかし,chKana1ToNameを宣言する際に,"が", "ぎ", "ぐ", "げ", "ご",を"あ", "い", "う", "え", "お",に書き換えたり,
62行目のchKana1ToName[num + 45]の添字をnumにしたりすると処理速度が変わらず普通に動作します。
他にも,配列を別々に分けたり,strcpyで後から文字列を代入してみたりしましたが改善策が見つからず半日中唸ってました。

 一体,なぜこのようになるのか,また改善策はどのようなものがあるのか教えていただければ助かります。
 制作環境は,Windows7,Visual Studio Express 2013 for Wisows Desktopです。よろしくお願いします。

だんごさん
記事: 273
登録日時: 13年前

Re: DrawStringToHandleでの全角文字の表示について

#2

投稿記事 by だんごさん » 9年前

簡単にですが実際に動かしてみました。
ですが特にfpsが極端に下がることはありませんでした。
動かすために少々変更したところは、フォントはデフォルトになったことと、strSelectMode[][5]の添字とchKana1ToName[][3]の添字をそれぞれ+2ほどしました。
(これはエンティティを初期化できませんというエラーが出たため)
画像
 Dango San

放浪中
記事: 12
登録日時: 10年前

Re: DrawStringToHandleでの全角文字の表示について

#3

投稿記事 by 放浪中 » 9年前

返信して頂きありがとうございます。今現在,開発環境がない状態なので明日,添字の値と
フォントをデフォルトフォントに変更して試してみたいと思います!

放浪中
記事: 12
登録日時: 10年前

Re: DrawStringToHandleでの全角文字の表示について

#4

投稿記事 by 放浪中 » 9年前

 要素の値とフォントをデフォルトフォントに変更して再度実行してみましが,要素の値を変えても処理が重いままでした。
ただ,デフォルトフォント(DrawFormatString関数)で実行したところ処理速度は変わらず(約60fps)普通に動作しました。
実際の実行結果が以下のようになります。
添付ファイル
_5.png
DrawFormatString関数を使って,デフォルトフォントで実行した場合です。fpsは下がっておらず普通に動作しています。
_2.png
62行目のchKana1ToName[num + 45]の添え字をnumにした場合です。fpsは下がっていません。
_1.png
実際に表示したい画面です。最初のソースコードを実行するとこのようにfpsが25~27くらいになります。

だんごさん
記事: 273
登録日時: 13年前

Re: DrawStringToHandleでの全角文字の表示について

#5

投稿記事 by だんごさん » 9年前

フォント名を教えていただきましたら再度動かしてみますのでよろしければお願いします。
 Dango San

放浪中
記事: 12
登録日時: 10年前

Re: DrawStringToHandleでの全角文字の表示について

#6

投稿記事 by 放浪中 » 9年前

 使用フォントはメイリオです。ただ,今別の変数に同じフォントデータを代入して実行してみたところ正常に動作しました。
しかし,根本的な原因が分からないので,まだ解決にはしないでおこうと思います。

だんごさん
記事: 273
登録日時: 13年前

Re: DrawStringToHandleでの全角文字の表示について

#7

投稿記事 by だんごさん » 9年前

フォントをメイリオにしてみましたがfpsが下がることはありませんでした。
別の変数に代入すると正常に動くとのことですが、コードに問題があったのかDxLib側の問題だったのかは分かりません。
もしよろしければ、主にフォントを作成した部分とフォントデータを代入してみたところのコードを載せていただけますでしょうか?
もし特に問題が無いのに不具合が起きた場合、DxLibの掲示板で聞くのも一つの手です。
 Dango San

放浪中
記事: 12
登録日時: 10年前

Re: DrawStringToHandleでの全角文字の表示について

#8

投稿記事 by 放浪中 » 9年前

ごちゃごちゃしていますが,以下が正常に動作したソースコードになります。

コード:

/* font_data.h */
#ifndef FONT_DATA_H
#define	FONT_DATA_H

//#define
#define	FONT_DATA_NUM	20

//フォントデータ
struct fontData{

	int	font;

};

extern	struct fontData	Font[FONT_DATA_NUM];

#endif // !FONT_DATA_H

void	loadFont();

コード:

/* LoadFont.cpp */
#include	"sksn_include.h"

//フォントデータ
struct fontData	Font[FONT_DATA_NUM];

static	char	hoge[64];

void	loadFont(){

	const	int	font_num = 5;

	LPCSTR font_path[font_num];

	for (int i = 0; i < font_num; i++){

		sprintf(hoge, "systemFile/font/font_%d.ttf", i);

		font_path[i] = hoge; // 読み込むフォントファイルのパス

		if (AddFontResourceEx(font_path[i], FR_PRIVATE, NULL) > 0) {
		}
		else {
			// フォント読込エラー処理
			MessageBox(NULL, "フォント読込失敗", "", MB_OK);
		}
	}

	for (int i = 0; i < FONT_DATA_NUM; i++){

		switch (i){

			case	0:	//Calligraph421 BT : title_select
				Font[i].font = CreateFontToHandle("Calligraph421 BT", 24, 4, DX_FONTTYPE_ANTIALIASING);
				break;

			case	1:
				Font[i].font = CreateFontToHandle("Calligraph421 BT", 72, 4, DX_FONTTYPE_ANTIALIASING);
				break;

			case	2:
				Font[i].font = CreateFontToHandle("メイリオ", 20, 1, DX_FONTTYPE_ANTIALIASING);  //処理が重くなった際に使用していたフォントデータ  Font[2].font
				break;

			case	3:
				Font[i].font = CreateFontToHandle("メイリオ", 20, 1, DX_FONTTYPE_ANTIALIASING);  //別の変数に代入したフォントデータ(正常に実行できた)  Font[3].font
				break;

		}
	}
}

コード:

//文字・文字列表示
void    showCharStrToName(int   toNameState, int    nowShowChar){
 
    const   int sa = 1;
    const   int stringNum = 7;
 
    const   char    strAtcName[64] = { "主人公の名前を決めてください。" };
    const   char    strSelectMode[][7] = { "かな", "カナ", "漢字", "英数", "消去", "戻る", "OK!" };
    const   char    chKana1ToName[][5] = { 
                                           "あ", "い", "う", "え", "お",
                                           "か", "き", "く", "け", "こ",
                                           "さ", "し", "す", "せ", "そ",
                                           "た", "ち", "つ", "て", "と",
                                           "な", "に", "ぬ", "ね", "の",
                                           "は", "ひ", "ふ", "へ", "ほ",
                                           "ま", "み", "む", "め", "も",
                                           "や", "ゆ", "よ", "わ", "ん",
                                           "ら", "り", "る", "れ", "ろ",
                                           "が", "ぎ", "ぐ", "げ", "ご",
                                           "ざ", "じ", "す", "ぜ", "ぞ",
                                           "だ", "ぢ", "づ", "で", "ど",
                                           "ば", "び", "ぶ", "べ", "ぼ",
                                           "ぱ", "ぴ", "ぷ", "ぺ", "ぽ",
                                           "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
                                           "っ", "ゃ", "ゅ", "ょ", "ゎ",
                                           "を", " ", "ー", "=", "~",
                                           "¥", "#", "$", "%", "&"
                                         };
 
    /*static    char    chKana2ToName[][3] = {
                                           "が", "ぎ", "ぐ", "げ", "ご",
                                           "ざ", "じ", "ず", "ぜ", "ぞ",
                                           "だ", "ぢ", "づ", "で", "ど",
                                           "ば", "び", "ぶ", "べ", "ぼ",
                                           "ぱ", "ぴ", "ぷ", "ぺ", "ぽ",
                                           "ぁ", "ぃ", "ぅ", "ぇ", "ぉ",
                                           "っ", "ゃ", "ゅ", "ょ", "ゎ",
                                           "を", " ", "ー", "=", "~",
                                           "¥", "#", "$", "%", "&"
                                         };*/
 
    static  int mojiColor[] = { CHAR_COLOR2, CHAR_COLOR1 };
 
    switch (toNameState){
 
        case    0:
            for (int i = 0; i < 2; i++){
                DrawStringToHandle(100 + sa - i, 80 + sa - i, strAtcName, mojiColor[i], Font[2].font);
 
                for (int j = 0; j < stringNum; j++){
                    DrawStringToHandle(100 + sa - i, (192 + j * 32) + sa - i, strSelectMode[j], mojiColor[i], Font[2].font);
                }
 
                if (nowShowChar == 0){  //ひらがな表示
 
                    int num;
 
                    for (int j = 0; j < 9; j++){
                        for (int k = 0; k < 5; k++){
                            num = j * 5 + k;
                            DrawStringToHandle((180 + k * 32) + sa - i, (192 + j * 24) + sa - i, chKana1ToName[num], mojiColor[i], Font[3].font);       //Font[2].font -> Font[3].font
                            DrawStringToHandle((368 + k * 32) + sa - i, (192 + j * 24) + sa - i, chKana1ToName[num + 45], mojiColor[i], Font[3].font);  //Font[2].font -> Font[3].font
                        }   
                    }
 
                }
            }
 
            break;
    
    }
 
    //DrawLine(182,0,182,480,COLOR_BLACK);
    //DrawLine(0, 360, 640, 360, COLOR_BLACK);
 
}

だんごさん
記事: 273
登録日時: 13年前

Re: DrawStringToHandleでの全角文字の表示について

#9

投稿記事 by だんごさん » 9年前

おそらくDX_FONTTYPE_ANTIALIASINGでアンチエイリアスを有効にしていて、かつ描画回数が多すぎるのが原因だと思います。

別の変数に代入して速度が速く感じたのは、strAtcNameとstrSelectModeの描画とひらがなの描画で違うフォントハンドル(Font[2]と[3])を使用していたため(フォントの中身が同じなのに遅くなるのは不明)だと思います。
解決方法としては一文字ずつ描画するのではなく、できるだけまとめて表示するか、描画回数が多い場所のフォントをアンチエイリアスのないものにすること、または画像にしてしまうかです。
とはいえかなり遅いのでもしかするとDxLib側でなんらかの問題が起こっているかもしれません。
気になるのでしたらDxLibの掲示板で質問してみてはいかがでしょう。
 Dango San

放浪中
記事: 12
登録日時: 10年前

Re: DrawStringToHandleでの全角文字の表示について

#10

投稿記事 by 放浪中 » 9年前

だんごさんさん,ありがとうございます。

アンチエイリアス効果や描画回数などを気にして制作する必要がありそうですね。参考にしていきたいと思います。
文字列にまとめて表示する方法は私も考えましたが,カーソル位置に合わせて文字の色を変えるため,一文字ずつ描画する方法にしました。
ただ,一文字ずつ描画する必要がない場合,かつ大量の文字を表示する場合は画像にしたり,まとめて表示するなどの工夫をしていきたいと思います。
またこのような場面に遭遇したら,DxLibの掲示板で質問してみます。

プログラムの方は,今のところ正常に動作しているので解決にしたいと思います。
これからのゲーム制作の参考になる意見をくださりありがとうございました!

閉鎖

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