まあとりあえずソースコードと説明書(?)を載せておこうと思います。
ちなみに明日から3日間、部活の遠征に行くので作業は進みません。
#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