依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 5|回复: 0

[游戏架设教程] [传奇技术]NPC对话框文字显示设定

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12523
发表于 3 小时前 | 显示全部楼层 |阅读模式
[传奇技术]NPC对话框文字显示设定
  1. void RichTextEx::SetText(string strIn, bool fromNpc) //NPC对话框文字显示设定
  2. {
  3.         Reset();
  4.         StrReplace(strIn, "\r", "");
  5.         vector<string> strRow;
  6.         fastsplit(strRow, strIn, '\\');
  7.         if (fromNpc && strRow.size() > 10)
  8.         {
  9.                 vector<string> strRowTemp;
  10.                 bool removeEmptyRow = true;
  11.                 for (size_t i = 0; i < strRow.size(); i++)
  12.                 {
  13.                         string& row = strRow[i];
  14.                         if (!(removeEmptyRow && isEmptyRow(row)))
  15.                         {
  16.                                 strRowTemp.push_back(row);
  17.                         }
  18.                 }
  19.                 strRow = strRowTemp;
  20.         }

  21.         int LINE_SPACE = 2;
  22.         int textLineH = (m_fontDefinition._fontSize + LINE_SPACE);
  23.         int EMPTY_LINE_HIGHT = 4 + LINE_SPACE;
  24.         //if (!WIN_VERSION && fromNpc)
  25.         //{
  26.         //        LINE_SPACE = 10;
  27.         //        textLineH = (m_fontDefinition._fontSize + LINE_SPACE);
  28.         //        EMPTY_LINE_HIGHT = textLineH;
  29.         //}
  30.         int endsign = 0;
  31.         int xxxxx = 0;
  32.         int yyyyy = 0;
  33.         int xStartFixed = 0;
  34.         int yCountByXStartFixed = 0;
  35.         int yCountByXStartFixedRaw = 0;
  36.         int iconH = 0;
  37.         int yEmptyLine = 0;
  38.         int oldY = 0;
  39.         for (size_t i = 0; i < strRow.size(); i++)
  40.         {
  41.                 int tmpWidth = xStartFixed;
  42.                 int curMaxWidth = 0;
  43.                 string tmpstr = strRow[i];
  44.                 if (tmpstr != "  ")
  45.                 {
  46.                         if (tmpstr.empty())
  47.                         {
  48.                                 if (yCountByXStartFixed > 0)
  49.                                 {
  50.                                         yCountByXStartFixed--;
  51.                                 }
  52.                                 continue;
  53.                         }
  54.                         while (!tmpstr.empty())
  55.                         {
  56.                                 //判断是否特殊处理
  57.                                 int tmpsign1 = tmpstr.find('<');
  58.                                 endsign = tmpstr.find('>');
  59.                                 if (endsign < 0)
  60.                                 {
  61.                                         tmpsign1 = -1;
  62.                                 }
  63.                                 int tmpsign2 = tmpstr.find('{');
  64.                                 endsign = tmpstr.find('}');
  65.                                 if (endsign < 0)
  66.                                 {
  67.                                         tmpsign2 = -1;
  68.                                 }
  69.                                 int tmpsign = tmpsign1;
  70.                                 int tmpsignType = (tmpsign1 < 0) ? -1 : 1;
  71.                                 if ((tmpsign2 >= 0) && ((tmpsign1 < 0) || (tmpsign2 < tmpsign1)))
  72.                                 {
  73.                                         tmpsign = tmpsign2;
  74.                                         tmpsignType = 2;
  75.                                 }
  76.                                 if (tmpsignType == -1)
  77.                                 {
  78.                                         //没有特殊符号需要处理直接画
  79.                                         parsePlainText(tmpstr, xxxxx, yyyyy, tmpWidth);
  80.                                         break;
  81.                                 }
  82.                                 if (tmpsign == 0)
  83.                                 {
  84.                                         int startPos = (tmpsignType == 1) ? tmpsign1 : tmpsign2;
  85.                                         int endPos = 0;
  86.                                         if (tmpsignType == 1)
  87.                                         {
  88.                                                 endPos = tmpstr.find('>');
  89.                                         }
  90.                                         else
  91.                                         {
  92.                                                 endPos = tmpstr.find('}');
  93.                                         }
  94.                                         //处理颜色字体
  95.                                         string str = tmpstr.substr(startPos, endPos - startPos + 1);
  96.                                         size_t offset = 0;
  97.                                         bool flag = true;
  98.                                         while (flag)
  99.                                         {
  100.                                                 flag = false;
  101.                                                 static string imgMark = "<IMG:";
  102.                                                 static string imgExMark = "<IMGEX:";
  103.                                                 static string playImgMark = "<PlayIMG:";
  104.                                                 static string playImgExMark = "<PlayIMGEX:";
  105.                                                 if (!strncasecmp(str.c_str(), imgMark.c_str(), imgMark.size()))
  106.                                                 {
  107.                                                         tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
  108.                                                         str = str.substr(imgMark.size(), str.size() - imgMark.size() - 1);
  109.                                                         parseImg(str, xxxxx, yyyyy, curMaxWidth);
  110.                                                         break;
  111.                                                 }
  112.                                                 if (!strncasecmp(str.c_str(), imgExMark.c_str(), imgExMark.size()))
  113.                                                 {
  114.                                                         tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
  115.                                                         str = str.substr(imgExMark.size(), str.size() - imgExMark.size() - 1);
  116.                                                         parseImgEx(str, xxxxx, yyyyy, curMaxWidth);
  117.                                                         break;
  118.                                                 }
  119.                                                 if (!strncasecmp(str.c_str(), playImgMark.c_str(), playImgMark.size()))
  120.                                                 {
  121.                                                         tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
  122.                                                         str = str.substr(playImgMark.size(), str.size() - playImgMark.size() - 1);
  123.                                                         parsePlayImg(str, xxxxx, yyyyy, curMaxWidth);
  124.                                                         break;
  125.                                                 }
  126.                                                 if (!strncasecmp(str.c_str(), playImgExMark.c_str(), playImgExMark.size()))
  127.                                                 {
  128.                                                         tmpstr = tmpstr.substr(str.length(), tmpstr.length() - str.length());
  129.                                                         str = str.substr(playImgExMark.size(), str.size() - playImgExMark.size() - 1);
  130.                                                         parsePlayImgEx(str, xxxxx, yyyyy, curMaxWidth);
  131.                                                         break;
  132.                                                 }
  133.                                                 int pos = str.find('/', offset);
  134.                                                 if (pos == -1)
  135.                                                 {
  136.                                                         static string itemIconMark = "<ITEMICON:";
  137.                                                         static string skillIconMark = "<SHOWICON:";
  138.                                                         static string gemIconMark = "<GEMICON:";
  139.                                                         //static string seperateBar = "<BAR>";
  140.                                                         if (!strncasecmp(str.c_str(), itemIconMark.c_str(), itemIconMark.size()))
  141.                                                         {
  142.                                                                 oldY = yyyyy;
  143.                                                                 parseItemIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
  144.                                                                 yEmptyLine = 0;
  145.                                                                 yCountByXStartFixedRaw = yCountByXStartFixed;
  146.                                                                 if (yCountByXStartFixed == 0)
  147.                                                                 {
  148.                                                                         xStartFixed = 0;
  149.                                                                         yyyyy += textLineH;
  150.                                                                 }
  151.                                                                 else
  152.                                                                 {
  153.                                                                         xStartFixed = xxxxx;
  154.                                                                         iconH = oldY - yyyyy;
  155.                                                                         yyyyy = oldY + textLineH;
  156.                                                                         yCountByXStartFixed++;
  157.                                                                 }
  158.                                                         }
  159.                                                         else if (!strncasecmp(str.c_str(), skillIconMark.c_str(), skillIconMark.size()))
  160.                                                         {
  161.                                                                 oldY = yyyyy;
  162.                                                                 parseSkillIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
  163.                                                                 yEmptyLine = 0;
  164.                                                                 yCountByXStartFixedRaw = yCountByXStartFixed;
  165.                                                                 if (yCountByXStartFixed == 0)
  166.                                                                 {
  167.                                                                         xStartFixed = 0;
  168.                                                                         yyyyy += textLineH;
  169.                                                                 }
  170.                                                                 else
  171.                                                                 {
  172.                                                                         xStartFixed = xxxxx;
  173.                                                                         iconH = oldY - yyyyy;
  174.                                                                         yyyyy = oldY + textLineH;
  175.                                                                         yCountByXStartFixed++;
  176.                                                                 }
  177.                                                         }
  178.                                                         else if (!strncasecmp(str.c_str(), gemIconMark.c_str(), gemIconMark.size()))
  179.                                                         {
  180.                                                                 oldY = yyyyy;
  181.                                                                 parseGemIcon(str, xxxxx, yyyyy, tmpWidth, yCountByXStartFixed, tmpstr);
  182.                                                                 yEmptyLine = 0;
  183.                                                                 yCountByXStartFixedRaw = yCountByXStartFixed;
  184.                                                                 if (yCountByXStartFixed == 0)
  185.                                                                 {
  186.                                                                         xStartFixed = 0;
  187.                                                                         yyyyy += textLineH;
  188.                                                                 }
  189.                                                                 else
  190.                                                                 {
  191.                                                                         xStartFixed = xxxxx;
  192.                                                                         iconH = oldY - yyyyy;
  193.                                                                         yyyyy = oldY + textLineH;
  194.                                                                         yCountByXStartFixed++;
  195.                                                                 }
  196.                                                         }
  197.                                                         //else if (!strncasecmp(str.c_str(), seperateBar.c_str(), seperateBar.size()))
  198.                                                         //{
  199.                                                         //}
  200.                                                         else
  201.                                                         {
  202.                                                                 parseSignText(str, xxxxx, yyyyy, tmpWidth, tmpstr);
  203.                                                         }
  204.                                                 }
  205.                                                 else
  206.                                                 {
  207.                                                         char ch = str[pos + 1];
  208.                                                         ch = (char)::tolower(ch);
  209.                                                         if (g_colorFlags.find(ch) != g_colorFlags.end())
  210.                                                         {
  211.                                                                 const char* pStr = str.c_str() + pos;
  212.                                                                 if (!strncasecmp(pStr, "/AUTOCOLOR", strlen("/AUTOCOLOR")) ||
  213.                                                                         !strncasecmp(pStr, "/#sCOLOR", strlen("/#sCOLOR")) ||
  214.                                                                         !strncasecmp(pStr, "/SCOLOR", strlen("/SCOLOR")) ||
  215.                                                                         !strncasecmp(pStr, "/FCOLOR", strlen("/FCOLOR"))
  216.                                                                         )
  217.                                                                 {
  218.                                                                         //case 'A'://AUTOCOLOR
  219.                                                                         //case '#'://#sCOLOR
  220.                                                                         //case 'S'://SCOLOR
  221.                                                                         //case 'F'://FCOLOR
  222.                                                                         //文字颜色
  223.                                                                         parseColorText(str, pos, ch, xxxxx, yyyyy, tmpWidth, tmpstr);
  224.                                                                 }
  225.                                                                 else
  226.                                                                 {
  227.                                                                         flag = true;
  228.                                                                         offset = pos + 1;
  229.                                                                 }
  230.                                                         }
  231.                                                         else if (ch == '@')
  232.                                                         {
  233.                                                                 //点击类型
  234.                                                                 parseLinkText(str, pos, xxxxx, yyyyy, tmpWidth, tmpstr);
  235.                                                         }
  236.                                                         else
  237.                                                         {
  238.                                                                 if (!g_colorFlags.empty())
  239.                                                                 {
  240.                                                                         flag = true;
  241.                                                                         offset = pos + 1;
  242.                                                                 }
  243.                                                         }
  244.                                                 }
  245.                                         }
  246.                                 }
  247.                                 else
  248.                                 {
  249.                                         int startPos = (tmpsignType == 1) ? tmpsign1 : tmpsign2;
  250.                                         parseBeforeSignText(tmpstr, startPos, xxxxx, yyyyy, tmpWidth);
  251.                                 }
  252.                         }
  253.                         yyyyy -= textLineH;
  254.                         if (yCountByXStartFixed > 0)
  255.                         {
  256.                                 yCountByXStartFixed--;
  257.                         }
  258.                 }
  259.                 else
  260.                 {
  261.                         yEmptyLine++;
  262.                         yyyyy -= EMPTY_LINE_HIGHT;
  263.                         if (yCountByXStartFixed > 0)
  264.                         {
  265.                                 yCountByXStartFixed--;
  266.                         }
  267.                 }
  268.                 if (m_width < tmpWidth)
  269.                         m_width = tmpWidth;
  270.                 if (m_width < curMaxWidth)
  271.                         m_width = curMaxWidth;

  272.                 if (yCountByXStartFixed <= 0)
  273.                 {
  274.                         xStartFixed = 0;
  275.                         if (iconH != 0)
  276.                         {
  277.                                 int offsetY = (yCountByXStartFixedRaw - yEmptyLine) * textLineH + yEmptyLine * EMPTY_LINE_HIGHT;
  278.                                 if (offsetY < iconH)
  279.                                 {
  280.                                         yyyyy = oldY;
  281.                                         yyyyy -= iconH + EMPTY_LINE_HIGHT;
  282.                                 }
  283.                                 iconH = 0;
  284.                                 yEmptyLine = 0;
  285.                         }
  286.                 }
  287.                 xxxxx = xStartFixed;
  288.         }
  289.         if (iconH != 0)
  290.         {
  291.                 int offsetY = (yCountByXStartFixedRaw - yEmptyLine) * textLineH + yEmptyLine * EMPTY_LINE_HIGHT;
  292.                 if (offsetY < iconH)
  293.                 {
  294.                         yyyyy = oldY;
  295.                         yyyyy -= iconH + EMPTY_LINE_HIGHT;
  296.                 }
  297.                 iconH = 0;
  298.                 yEmptyLine = 0;
  299.         }
  300.         m_height = -yyyyy;
  301.         this->setContentSize(Size(m_width, m_height));
  302. }
复制代码


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-1-24 16:32

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表