RUUtils.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // 常用工具方法
  3. //
  4. #ifndef RURedUtil_h
  5. #define RURedUtil_h
  6. #include "cocos2d.h"
  7. #include "RUDefine.h"
  8. #include "Redream.h"
  9. #include <google/protobuf/message_lite.h>
  10. using namespace std;
  11. USING_NS_CC;
  12. NS_RU_BEGIN
  13. class MapRhombusGrid;
  14. class QCoreLayer;
  15. // MARK: 随机方法
  16. // 随机一个数
  17. int randomInt(int start, int end);
  18. // 随机数组的迭代器
  19. template <class T>
  20. typename vector<T>::iterator randomIter(vector<T> &array){
  21. int index = rand() % array.size();
  22. return array.begin() + index;
  23. }
  24. // 随机一个数组value
  25. template <class T>
  26. T randomObj(vector<T> &array){
  27. int index = rand() % array.size();
  28. return *(array.begin() + index);
  29. }
  30. // 根据权重随机数组的index
  31. int randomIndexByRatio(const vector<int> &array);
  32. // 根据权重随机一个数组value
  33. template <class T>
  34. T randomObjByRatio(const vector<T> &array,const vector<int> &ratio){
  35. int idx = randomIndexByRatio(ratio);
  36. return array[idx];
  37. }
  38. // 数组是否包含该对象 T要实现 == 操作符
  39. template <class T>
  40. bool isContain(const T* array, int len, T check){
  41. for (int i = 0; i < len ; i++) {
  42. if (array[i] == check) {
  43. return true;
  44. }
  45. }
  46. return false;
  47. }
  48. // MARK: 经常要用到位置操作方法
  49. Vec2 up(const Vec2 &logicPos);
  50. Vec2 down(const Vec2 &logicPos);
  51. Vec2 left(const Vec2 &logicPos);
  52. Vec2 right(const Vec2 &logicPos);
  53. Vec2 upLeft(const Vec2 &logicPos);
  54. Vec2 upRight(const Vec2 &logicPos);
  55. Vec2 downLeft(const Vec2 &logicPos);
  56. Vec2 downRight(const Vec2 &logicPos);
  57. // MARK: UI相关的常用方法
  58. // 解锁屏
  59. void LockScreenForSec(float sec);
  60. void LockScreenByTag(int tag);
  61. void unLockScreenByTag(int tag);
  62. // 分割字符串
  63. void splitString(const std::string& s, std::vector<std::string>& v, const std::string& c);
  64. typedef struct _ProgressArgs {
  65. Vec2 midPoint = Vec2(0,0); //变化起始点
  66. Vec2 barChangeRate = Vec2(1,0);
  67. bool reverse = false;//慢慢显示进度还是慢慢消失进度
  68. ProgressTimer::Type progressType = ProgressTimer::Type::BAR;//圆形还是条形
  69. } ProgressArgs;
  70. // 根据一个精灵创建一个进度条
  71. ProgressTimer* createCCProgressTimeFromCCSprite(Sprite* sprite,const ProgressArgs& args);
  72. enum class kGTLevelType {
  73. DEFAULT, //普通关卡编号(1~无穷大)
  74. MINIGAME, //miniGame关卡 [1001-2000] 最多99个minigame
  75. BI_ROOM, //家装房间 [9001-9100] 最多100个房间
  76. BI_TASK, //家装任务 [10001-13000] 做多家装3000个任务
  77. };
  78. // 获取上传gt的关卡编号
  79. int getGTLevel(kGTLevelType type, int baseLevel);
  80. bool protobufLoad(const string& fileName, google::protobuf::MessageLite* data);
  81. void protobufSave(const string& fileName, google::protobuf::MessageLite* data);
  82. /// 计算多边形所占菱形网格
  83. /// @param ori 原点
  84. /// @param poly 多边形坐标
  85. /// @param rhombusGrid 导航网格
  86. /// @param bStrictMode 严格模式意味着只要多边形和网格交叉就算;否则看网格的中心点是否在多边形内
  87. vector<Vec2> getRhombusGridFromPolygon(const Vec2& ori, vector<Vec2> poly, MapRhombusGrid *rhombusGrid, bool bStrictMode = false);
  88. // 获取当前的天数
  89. int getLocalToday();
  90. // 贝塞尔曲线的控制参数
  91. typedef struct{
  92. float bezierCur; // 中段的曲率
  93. float bezierDec; // 下调程度
  94. float basisPointRatio; // 控制点1基准点(基于哪个点的中垂线进行偏移)
  95. }BezierParams;
  96. /// 计算贝塞尔曲线运动的参数
  97. /// @param startPoint 开始位置
  98. /// @param endPoint 结束位置
  99. /// @param stencil 模板类型
  100. /// @param config 曲线的控制参数
  101. cocos2d::ccBezierConfig calBezierConfig(const Vec2& startPoint,const Vec2& endPoint, string stencil, BezierParams* config);
  102. /// 遍历粒子Particle,执行指定的操作
  103. void iterateParticles(Node* pNode, std::function<void(cocos2d::ParticleSystem*)> cb);
  104. /// 对每个节点施加操作
  105. void iterateNode(Node* pNode, std::function<void(Node*)> cb);
  106. /// 改变node的父节点
  107. void changeNodeParent(Node* node, Node* parent);
  108. /// 点是否在多边形内部或者边界线上面(不能处理多边形的边界有交叉的情况)
  109. bool isPointInPolygon(const Vec2& point, const std::vector<Vec2>& polygon);
  110. /// 将字符串解析为一个float list
  111. /// @param v 字符串
  112. std::list<float> parseAsFloatList(const string& v);
  113. /// 将字符串解析为一个string list
  114. /// @param v 字符串
  115. std::vector<string> parseAsStringList(const string& v, const string& sep = ",");
  116. /// 将字符串解析为一个int list
  117. /// @param v 字符串
  118. std::vector<int> parseAsIntList(const string& v);
  119. /// 将字符串解析为一个pair<Value,Value> 的list
  120. /// @param v 字符串
  121. std::vector<std::pair<cocos2d::Value,cocos2d::Value>> parseAsPairList(const string& v, const string& sep = ",");
  122. /// 将字符串解析为一个pair<string,string> list
  123. /// @param v 字符串
  124. std::vector<std::pair<std::string,std::string>> parseAsPairStringList(const string& v);
  125. /// 在一个标签中显示倒计时,
  126. /// @param showHours 是否显示小时位
  127. void showTimingInLable(cocos2d::Label* label, std::function<int()> getCooldown, bool showHours = true, bool hourAlways = true);
  128. /// 解析一个时间字符串,比如 1d, 10h, 3m,2d12h30m30 等,不带单位的话认为是秒,返回单位为秒
  129. int parseStringAsTime(const std::string& str);
  130. /// 读取适配后的资源
  131. /// @param resName 基础的资源名称
  132. /// @param bUseAdapt 是否使用适配
  133. QCoreLayer* readLayer(const char* resName, bool bUseAdapt);
  134. /// 读取适配后的资源
  135. /// @param resName 基础的资源名称
  136. /// @param bUseAdapt 是否使用适配
  137. /// @param reader 读取器
  138. cocos2d::Node* readNodeWithAdapt(redream::REDReader * reader, const char* resName, bool bUseAdapt);
  139. // Json解析
  140. Json getConfigWithName(const std::string& jsonName);
  141. // 将某个节点拉伸以适配屏幕
  142. void smartScaleHeight(Node* layer, Size designSize);
  143. NS_RU_END
  144. #endif /* RURedUtil_h */