DXライブラリでHTMLみたいなタグが使える文字表示関数 途中経過

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

DXライブラリでHTMLみたいなタグが使える文字表示関数 途中経過

投稿記事 by MoNoQLoREATOR » 14年前

この前言っていた関数が、正に2度の仕様変更を経て形になりました。・・・と思ったら必ずフリーズする・・・orz
まあとりあえずソースコードと説明書(?)を載せておこうと思います。
ちなみに明日から3日間、部活の遠征に行くので作業は進みません。

CODE:

#define _CRT_SECURE_NO_DEPRECATE
#include "DxLib.h"
#include 
#include 
#include 
#include 

struct TagData{
	int x;
	int y;
	int color;
	int fHand;
	std::string outStr;
	int width;
	int size;
	size_t backNum;
};

void DeleteTagData(std::vector &tagData){
	for(size_t i=0;i &tagData, std::vector &allData, int argu[20], std::string &fontName){
				allData.resize(allData.size()+1);
				allData[allData.size()-1] = tagData[tagData.size()-1];
				allData[allData.size()-1].backNum = tagData.size()-1;

				tagData[tagData.size()-1].x += argu[17];
				tagData[tagData.size()-1].y += argu[18];
				tagData[tagData.size()-1].color = argu[13];
				tagData[tagData.size()-1].size = argu[15];
				tagData[tagData.size()-1].fHand = CreateFontToHandle(fontName.c_str() ,argu[6],argu[5],argu[8]);
}

//再帰関数
void TagEnter(
			  std::vector &tagData, std::vector &allData,
			  int argu[20],
			  int &maxSize, int &leftNum, bool backFlag, std::string &fontName){
	using namespace std;

	leftNum=1;
	maxSize = tagData[tagData.size()-1].size;
	
	//文字列がブレークポイントを超えなくなるまで繰り返す
	for(size_t i=tagData[tagData.size()-1].outStr.length()-1;i>0;i--){
		//短くした文字列の長さを記録
		tagData[tagData.size()-1].width = GetDrawFormatStringWidthToHandle(tagData[tagData.size()-1].fHand,"%s",tagData[tagData.size()-1].outStr.substr(0,i) );
	
		//ブレークポイント内におさまったら
		if(tagData[tagData.size()-1].x+tagData[tagData.size()-1].width = argu[10]){
				//再帰関数呼び出し
				TagEnter(
					tagData, allData,
					argu,
					maxSize, leftNum, backFlag, fontName
				);
			}

			tagData[tagNum].outStr = tagData[tagNum].outStr.substr(0,i);
			break;
		}
	}
}

std::vector CreateTagStringHandle(const char *baseStr){
	using namespace std;

	vector tagData;
	tagData.resize(1);
	int argu[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	unsigned int sp=0;
	string fontName;
	int maxSize=0;
	bool backFlag=0;
	int leftNum=0;
	vector allData;
	vector subData;

	//文字を1文字ずつ走査する
	while(sp '){
			bool fin=0;

			tagData[tagData.size()-1].outStr="";

			if(baseStr[sp]=='x'){
				argu[1] = atoi(FindArgu(baseStr, sp) );
				tagData[tagData.size()-1].x = argu[1];
				leftNum=0, maxSize=0, sp+=2, fin=1;
			}
			if(baseStr[sp]=='y'&&fin==0) tagData[tagData.size()-1].y = atoi(FindArgu(baseStr, sp) ), leftNum=0, maxSize=0, sp+=2, fin=1;

			if(tagData.size()>1){
				tagData[tagData.size()-1].x = tagData[tagData.size()-2].x+tagData[tagData.size()-2].width;
				tagData[tagData.size()-1].y = tagData[tagData.size()-2].y;
			}

			if(baseStr[sp]=='c'&&fin==0){
				string par = FindArgu(baseStr, sp);

				SetTagColor(argu[3], par);
				sp+=6, fin=1;
			}
			if(baseStr[sp]=='r'&&fin==0){
				argu[3] = GetColor(atoi(FindArgu(baseStr, sp) ),atoi(FindArgu(baseStr, sp) ),atoi(FindArgu(baseStr, sp) )  );
				sp+=4, fin=1;
			}
			if(baseStr[sp]=='t'&&fin==0) argu[5] = atoi(FindArgu(baseStr, sp) ),	sp+=6, fin=1;
			if(baseStr[sp]=='s'&&fin==0){
				argu[6] = atoi(FindArgu(baseStr, sp) );
				if(argu[6] > maxSize) maxSize = argu[6];
				if(argu[19]){
					for(int i=0;i argu[6]) tagData[tagData.size()-2-i].y += (tagData[tagData.size()-2-i].size - argu[6])/(2/argu[19]);
						else tagData[tagData.size()-2-i].y += (argu[6] - tagData[tagData.size()-2-i].size)/(2/argu[19]);
					}
				}
				sp+=5, fin=1;
			}
			if(baseStr[sp]=='f'&&baseStr[sp+4]=='-'&&fin==0){
				string par = FindArgu(baseStr, sp);

					if(par=="normal") argu[8] = DX_FONTTYPE_NORMAL;
					if(par=="edge") argu[8] = DX_FONTTYPE_EDGE;
					if(par=="anti") argu[8] = DX_FONTTYPE_ANTIALIASING;
					if(par=="anti-edge") argu[8] = DX_FONTTYPE_ANTIALIASING_EDGE;

				sp+=10, fin=1;
			}
			if(baseStr[sp]=='f'&&fin==0) fontName = FindArgu(baseStr, sp), sp+=5, fin=1;
			if(baseStr[sp]=='b'&&baseStr[sp+1]=='r'&&fin==0){
				//改行処理
				if(tagData.size() > 1) tagData[tagData.size()-1].y = tagData[tagData.size()-2].y+maxSize+atoi(FindArgu(baseStr, sp) );
				tagData[tagData.size()-1].x = argu[1];
				leftNum=0, maxSize=0, sp+=3, fin=1;
			}
			if(baseStr[sp]=='b'&&baseStr[sp+1]=='p'&&fin==0){
				argu[10] = atoi(FindArgu(baseStr, sp) ), argu[7] = atoi(FindArgu(baseStr, sp) );
				sp+=3, fin=1;
			}
			if(baseStr[sp]=='b'&&baseStr[sp+4]=='/'&&fin==0) backFlag=1, sp+=6, fin=1;
			if(baseStr[sp]=='/'&&fin==0) backFlag=0, sp+=6, fin=1;
			if(baseStr[sp]=='b'&&baseStr[sp+5]=='c'&&fin==0){
				string par = FindArgu(baseStr, sp);

				SetTagColor(argu[13], par);
				sp+=11, fin=1;
			}
			if(baseStr[sp]=='b'&&baseStr[sp+5]=='t'&&fin==0) argu[14] = atoi(FindArgu(baseStr, sp) ), sp+=11, fin=1;
			if(baseStr[sp]=='b'&&baseStr[sp+5]=='s'&&fin==0) argu[15] = atoi(FindArgu(baseStr, sp) ), sp+=11, fin=1;
			if(baseStr[sp]=='b'&&baseStr[sp+5]=='r'&&fin==0){
								argu[13] = GetColor(atoi(FindArgu(baseStr, sp) ),atoi(FindArgu(baseStr, sp) ),atoi(FindArgu(baseStr, sp) )  );
								sp+=11, fin=1;
			}
			if(baseStr[sp]=='b'&&baseStr[sp+5]=='m'&&fin==0){
				for(int i=0;i= argu[10]){
					//再帰関数呼び出し
					TagEnter(
						tagData, allData,
						argu,
						maxSize, leftNum, backFlag, fontName
					);
					breakFlag=1;
				}
			}

			if(breakFlag==0) tagData.resize(tagData.size()+1);
	}

	//二重表示の処理
	if(backFlag){
		subData.push_back(allData[0]);
		
		for(size_t i=0;i &drawData){
	using namespace std;
	int width=0;

	for(size_t i=0;i tagData = CreateTagStringHandle(recStr);
	int width = TagStringToHandle(tagData);
	
	DeleteTagData(tagData);

	return width;
}

とりあえずHTMLみたいに書いた文字列をTagStringにぶち込みます。そうするとその通りに描画してくれる・・・予定。主にテキストファイルから文字列を読み込んで表示する時に使用します。また、表示する文字列が頻繁に変わることがない場合は、CreateTagStringHandle関数でvector型の描画データを取得し、TagStringToHandle関数で描画すれば実行速度が上がります(その場合使い終わったらDeleteTagTagData関数を実行する必要があります)。

以下タグ一覧

x        引数1個  x座標を指定
y        引数1個  y座標を指定
color      引数1個  white:black:red:blue:green:yellow:purple:skyのどれかで色を指定
rgb       引数3個  RGB情報で色を指定
thick      引数1個  1~9で太さを指定
size       引数1個  px単位で大きさを指定
font       引数1個  フォントの名前を指定
font-type    引数1個  フォントのタイプをnormal:edge:anti:anti-edgeから指定
br        引数1個  改行。マージンを指定
bp        引数2個  ブレークポイント(x座標),マージンを指定
back/      引数0個  二重描画する文字列の始まりを意味する
/back      引数0個  二重描画する文字列の終わりを意味する
back-color   引数1個  二重描画する文字列の色を指定する
back-thick    引数1個  二重描画する文字列の太さを指定する
back-size    引数1個  二重描画する文字列の大きさを指定する
back-rgb    引数3個  二重描画する文字列の色をRGB情報で指定する
back-mov    引数2個  二重描画する文字列のx,y座標に加えるそれぞれの値を指定
arrenge     引数1個  サイズ変更時の文字の位置の揃え方をtop,center,bottomから指定する
abc"

そのうち完成させるので、まあ期待しておいてくださいw
最後に編集したユーザー MoNoQLoREATOR on 2011年7月26日(火) 00:06 [ 編集 1 回目 ]

コメントはまだありません。