一、解决装备技能的按钮闪烁问题时,用到了STL的算法std::includes(...); std::set_intersection(...); 第一个算法判断一个容器是否包含于另外一个容器,返回bool;第二个算法查找两个容器的公共元素并将其放于第三个容器中,返回第三个容器的迭代器。需要注意的是这两个算法都要求其容器是有序的其实升序排列的。所以用set会很方便。。。
// 1
std::set<int> int_set1;
for (int i=0; i<10; ++i)
int_set1.insert(i);
std::set<int> int_set2;
for (int j=0; j<5; ++j)
int_set2.insert(j);
bool is_include = std::includes(int_set1.begin(), int_set1.end(), int_set2.begin(), int_set2.end());
//2
std::vector<int> int_vec;
std::vector<int>::iterator ite = std::set_intersection(int_set1.begin(), int_set1.end(), int_set2.begin(), int_set2.end(), int_vec.begin());
代码2会出错!因为没有给int_vec分配内存,所以应该
int_vec.resize(10);
最后
if (static_cast<int>(ite - int_vec.begin()) > 0)
......
这个闪烁问题啊。。。由于服务器在每次穿或脱一件装备时都会把所有的装备都刷新一遍,附着在装备上的技能也要重新学习一遍或者忘记一遍。。。这个闪烁太复杂了。。。
考虑了几种实现方案都不能完美解决。。冥思苦想啊,最后终于解决了,也得到了一个教训,在这个问题焦灼的时候曾以为必须需要服务器更改规则或者添加数据库字段来支持才能解决,但是看来不需要也解决了。。。所以说只要拓宽思路,总有好的解决方案的。。^_^
2. 用tinyXml读配置文件时,知道了:
xml文件格式正常情况下必须只有一个最外层节点,不可有多个并列,若有多个并列可以在这些平行节点的外面套上一个外层节点;但是我测试过好像也可以有多个并列平行的情况,限制是只有一个可以嵌套子节点,其余的并列最外层节点必须只能有属性,不能再嵌套子节点、、、等有空了好好验证一下。。。姑且先这么人为吧。
还有就是弄清楚节点与元素的区别:元素是一种特殊的节点,也就是元素节点。。。呵呵
TiXmlElement:表示元素节点,可以包含子节点和TiXmlAttribute
TiXmlText:表示文本节点
TiXmlUnknown:表示未知节点,通常是出错了
TiXmlAttribute:表示一个元素的属性
最后操作元素时用handle不用文件指针,可以异常安全代码简约。。。