|
[传奇技术]NPC对话框文字显示设定
- void RichTextEx::SetText(string strIn, bool fromNpc) //NPC对话框文字显示设定
- {
- Reset();
- StrReplace(strIn, "\r", "");
- vector<string> strRow;
- fastsplit(strRow, strIn, '\\');
- if (fromNpc && strRow.size() > 10)
- {
- vector<string> strRowTemp;
- bool removeEmptyRow = true;
- for (size_t i = 0; i < strRow.size(); i++)
- {
- string& row = strRow[i];
- if (!(removeEmptyRow && isEmptyRow(row)))
- {
- strRowTemp.push_back(row);
- }
- }
- strRow = strRowTemp;
- }
- int LINE_SPACE = 2;
- int textLineH = (m_fontDefinition._fontSize + LINE_SPACE);
- int EMPTY_LINE_HIGHT = 4 + LINE_SPACE;
- //if (!WIN_VERSION && fromNpc)
- //{
- // LINE_SPACE = 10;
- // textLineH = (m_fontDefinition._fontSize + LINE_SPACE);
- // EMPTY_LINE_HIGHT = textLineH;
- //}
- int endsign = 0;
- int xxxxx = 0;
- int yyyyy = 0;
- int xStartFixed = 0;
- int yCountByXStartFixed = 0;
- int yCountByXStartFixedRaw = 0;
- int iconH = 0;
- int yEmptyLine = 0;
- int oldY = 0;
- for (size_t i = 0; i < strRow.size(); i++)
- {
- int tmpWidth = xStartFixed;
- int curMaxWidth = 0;
- string tmpstr = strRow[i];
- if (tmpstr != " ")
- {
- if (tmpstr.empty())
- {
- if (yCountByXStartFixed > 0)
- {
- yCountByXStartFixed--;
- }
- continue;
- }
- while (!tmpstr.empty())
- {
- //判断是否特殊处理
- int tmpsign1 = tmpstr.find('<');
- endsign = tmpstr.find('>');
- if (endsign < 0)
- {
- tmpsign1 = -1;
- }
- int tmpsign2 = tmpstr.find('{');
- endsign = tmpstr.find('}');
- if (endsign < 0)
- {
- tmpsign2 = -1;
- }
- int tmpsign = tmpsign1;
- int tmpsignType = (tmpsign1 < 0) ? -1 : 1;
- if ((tmpsign2 >= 0) && ((tmpsign1 < 0) || (tmpsign2 < tmpsign1)))
- {
- tmpsign = tmpsign2;
- tmpsignType = 2;
- }
- if (tmpsignType == -1)
- {
- //没有特殊符号需要处理直接画
- parsePlainText(tmpstr, xxxxx, yyyyy, tmpWidth);
- break;
- }
- if (tmpsign == 0)
- {
- int startPos = (tmpsignType == 1) ? tmpsign1 : tmpsign2;
- int endPos = 0;
- if (tmpsignType == 1)
- {
- endPos = tmpstr.find('>');
- }
- else
- {
- endPos = tmpstr.find('}');
- }
- //处理颜色字体
- string str = tmpstr.substr(startPos, endPos - startPos + 1);
- size_t offset = 0;
- bool flag = true;
- while (flag)
- {
- flag = false;
- static string imgMark = "<IMG:";
- static string imgExMark = "<IMGEX:";
- static string playImgMark = "<PlayIMG:";
- static string playImgExMark = "<PlayIMGEX:";
- if (!strncasecmp(str.c_str(), imgMark.c_str(), imgMark.size()))
- {
- tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
- str = str.substr(imgMark.size(), str.size() - imgMark.size() - 1);
- parseImg(str, xxxxx, yyyyy, curMaxWidth);
- break;
- }
- if (!strncasecmp(str.c_str(), imgExMark.c_str(), imgExMark.size()))
- {
- tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
- str = str.substr(imgExMark.size(), str.size() - imgExMark.size() - 1);
- parseImgEx(str, xxxxx, yyyyy, curMaxWidth);
- break;
- }
- if (!strncasecmp(str.c_str(), playImgMark.c_str(), playImgMark.size()))
- {
- tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
- str = str.substr(playImgMark.size(), str.size() - playImgMark.size() - 1);
- parsePlayImg(str, xxxxx, yyyyy, curMaxWidth);
- break;
- }
- if (!strncasecmp(str.c_str(), playImgExMark.c_str(), playImgExMark.size()))
- {
- tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
- str = str.substr(playImgExMark.size(), str.size() - playImgExMark.size() - 1);
- parsePlayImgEx(str, xxxxx, yyyyy, curMaxWidth);
- break;
- }
- int pos = str.find('/', offset);
- if (pos == -1)
- {
- static string itemIconMark = "<ITEMICON:";
- static string skillIconMark = "<SHOWICON:";
- static string gemIconMark = "<GEMICON:";
- //static string seperateBar = "<BAR>";
- if (!strncasecmp(str.c_str(), itemIconMark.c_str(), itemIconMark.size()))
- {
- oldY = yyyyy;
- parseItemIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
- yEmptyLine = 0;
- yCountByXStartFixedRaw = yCountByXStartFixed;
- if (yCountByXStartFixed == 0)
- {
- xStartFixed = 0;
- yyyyy += textLineH;
- }
- else
- {
- xStartFixed = xxxxx;
- iconH = oldY - yyyyy;
- yyyyy = oldY + textLineH;
- yCountByXStartFixed++;
- }
- }
- else if (!strncasecmp(str.c_str(), skillIconMark.c_str(), skillIconMark.size()))
- {
- oldY = yyyyy;
- parseSkillIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
- yEmptyLine = 0;
- yCountByXStartFixedRaw = yCountByXStartFixed;
- if (yCountByXStartFixed == 0)
- {
- xStartFixed = 0;
- yyyyy += textLineH;
- }
- else
- {
- xStartFixed = xxxxx;
- iconH = oldY - yyyyy;
- yyyyy = oldY + textLineH;
- yCountByXStartFixed++;
- }
- }
- else if (!strncasecmp(str.c_str(), gemIconMark.c_str(), gemIconMark.size()))
- {
- oldY = yyyyy;
- parseGemIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
- yEmptyLine = 0;
- yCountByXStartFixedRaw = yCountByXStartFixed;
- if (yCountByXStartFixed == 0)
- {
- xStartFixed = 0;
- yyyyy += textLineH;
- }
- else
- {
- xStartFixed = xxxxx;
- iconH = oldY - yyyyy;
- yyyyy = oldY + textLineH;
- yCountByXStartFixed++;
- }
- }
- //else if (!strncasecmp(str.c_str(), seperateBar.c_str(), seperateBar.size()))
- //{
- //}
- else
- {
- parseSignText(str, xxxxx, yyyyy, tmpWidth, tmpstr);
- }
- }
- else
- {
- char ch = str[pos + 1];
- ch = (char)::tolower(ch);
- if (g_colorFlags.find(ch) != g_colorFlags.end())
- {
- const char* pStr = str.c_str() + pos;
- if (!strncasecmp(pStr, "/AUTOCOLOR", strlen("/AUTOCOLOR")) ||
- !strncasecmp(pStr, "/#sCOLOR", strlen("/#sCOLOR")) ||
- !strncasecmp(pStr, "/SCOLOR", strlen("/SCOLOR")) ||
- !strncasecmp(pStr, "/FCOLOR", strlen("/FCOLOR"))
- )
- {
- //case 'A'://AUTOCOLOR
- //case '#'://#sCOLOR
- //case 'S'://SCOLOR
- //case 'F'://FCOLOR
- //文字颜色
- parseColorText(str, pos, ch, xxxxx, yyyyy, tmpWidth, tmpstr);
- }
- else
- {
- flag = true;
- offset = pos + 1;
- }
- }
- else if (ch == '@')
- {
- //点击类型
- parseLinkText(str, pos, xxxxx, yyyyy, tmpWidth, tmpstr);
- }
- else
- {
- if (!g_colorFlags.empty())
- {
- flag = true;
- offset = pos + 1;
- }
- }
- }
- }
- }
- else
- {
- int startPos = (tmpsignType == 1) ? tmpsign1 : tmpsign2;
- parseBeforeSignText(tmpstr, startPos, xxxxx, yyyyy, tmpWidth);
- }
- }
- yyyyy -= textLineH;
- if (yCountByXStartFixed > 0)
- {
- yCountByXStartFixed--;
- }
- }
- else
- {
- yEmptyLine++;
- yyyyy -= EMPTY_LINE_HIGHT;
- if (yCountByXStartFixed > 0)
- {
- yCountByXStartFixed--;
- }
- }
- if (m_width < tmpWidth)
- m_width = tmpWidth;
- if (m_width < curMaxWidth)
- m_width = curMaxWidth;
- if (yCountByXStartFixed <= 0)
- {
- xStartFixed = 0;
- if (iconH != 0)
- {
- int offsetY = (yCountByXStartFixedRaw - yEmptyLine) * textLineH + yEmptyLine * EMPTY_LINE_HIGHT;
- if (offsetY < iconH)
- {
- yyyyy = oldY;
- yyyyy -= iconH + EMPTY_LINE_HIGHT;
- }
- iconH = 0;
- yEmptyLine = 0;
- }
- }
- xxxxx = xStartFixed;
- }
- if (iconH != 0)
- {
- int offsetY = (yCountByXStartFixedRaw - yEmptyLine) * textLineH + yEmptyLine * EMPTY_LINE_HIGHT;
- if (offsetY < iconH)
- {
- yyyyy = oldY;
- yyyyy -= iconH + EMPTY_LINE_HIGHT;
- }
- iconH = 0;
- yEmptyLine = 0;
- }
- m_height = -yyyyy;
- this->setContentSize(Size(m_width, m_height));
- }
复制代码
|
|