// // 常用工具方法 // #ifndef RURedUtil_h #define RURedUtil_h #include "cocos2d.h" #include "RUDefine.h" #include "Redream.h" #include using namespace std; USING_NS_CC; NS_RU_BEGIN class MapRhombusGrid; class QCoreLayer; // MARK: 随机方法 // 随机一个数 int randomInt(int start, int end); // 随机数组的迭代器 template typename vector::iterator randomIter(vector &array){ int index = rand() % array.size(); return array.begin() + index; } // 随机一个数组value template T randomObj(vector &array){ int index = rand() % array.size(); return *(array.begin() + index); } // 根据权重随机数组的index int randomIndexByRatio(const vector &array); // 根据权重随机一个数组value template T randomObjByRatio(const vector &array,const vector &ratio){ int idx = randomIndexByRatio(ratio); return array[idx]; } // 数组是否包含该对象 T要实现 == 操作符 template bool isContain(const T* array, int len, T check){ for (int i = 0; i < len ; i++) { if (array[i] == check) { return true; } } return false; } // MARK: 经常要用到位置操作方法 Vec2 up(const Vec2 &logicPos); Vec2 down(const Vec2 &logicPos); Vec2 left(const Vec2 &logicPos); Vec2 right(const Vec2 &logicPos); Vec2 upLeft(const Vec2 &logicPos); Vec2 upRight(const Vec2 &logicPos); Vec2 downLeft(const Vec2 &logicPos); Vec2 downRight(const Vec2 &logicPos); // MARK: UI相关的常用方法 // 解锁屏 void LockScreenForSec(float sec); void LockScreenByTag(int tag); void unLockScreenByTag(int tag); // 分割字符串 void splitString(const std::string& s, std::vector& v, const std::string& c); typedef struct _ProgressArgs { Vec2 midPoint = Vec2(0,0); //变化起始点 Vec2 barChangeRate = Vec2(1,0); bool reverse = false;//慢慢显示进度还是慢慢消失进度 ProgressTimer::Type progressType = ProgressTimer::Type::BAR;//圆形还是条形 } ProgressArgs; // 根据一个精灵创建一个进度条 ProgressTimer* createCCProgressTimeFromCCSprite(Sprite* sprite,const ProgressArgs& args); enum class kGTLevelType { DEFAULT, //普通关卡编号(1~无穷大) MINIGAME, //miniGame关卡 [1001-2000] 最多99个minigame BI_ROOM, //家装房间 [9001-9100] 最多100个房间 BI_TASK, //家装任务 [10001-13000] 做多家装3000个任务 }; // 获取上传gt的关卡编号 int getGTLevel(kGTLevelType type, int baseLevel); bool protobufLoad(const string& fileName, google::protobuf::MessageLite* data); void protobufSave(const string& fileName, google::protobuf::MessageLite* data); /// 计算多边形所占菱形网格 /// @param ori 原点 /// @param poly 多边形坐标 /// @param rhombusGrid 导航网格 /// @param bStrictMode 严格模式意味着只要多边形和网格交叉就算;否则看网格的中心点是否在多边形内 vector getRhombusGridFromPolygon(const Vec2& ori, vector poly, MapRhombusGrid *rhombusGrid, bool bStrictMode = false); // 获取当前的天数 int getLocalToday(); // 贝塞尔曲线的控制参数 typedef struct{ float bezierCur; // 中段的曲率 float bezierDec; // 下调程度 float basisPointRatio; // 控制点1基准点(基于哪个点的中垂线进行偏移) }BezierParams; /// 计算贝塞尔曲线运动的参数 /// @param startPoint 开始位置 /// @param endPoint 结束位置 /// @param stencil 模板类型 /// @param config 曲线的控制参数 cocos2d::ccBezierConfig calBezierConfig(const Vec2& startPoint,const Vec2& endPoint, string stencil, BezierParams* config); /// 遍历粒子Particle,执行指定的操作 void iterateParticles(Node* pNode, std::function cb); /// 对每个节点施加操作 void iterateNode(Node* pNode, std::function cb); /// 改变node的父节点 void changeNodeParent(Node* node, Node* parent); /// 点是否在多边形内部或者边界线上面(不能处理多边形的边界有交叉的情况) bool isPointInPolygon(const Vec2& point, const std::vector& polygon); /// 将字符串解析为一个float list /// @param v 字符串 std::list parseAsFloatList(const string& v); /// 将字符串解析为一个string list /// @param v 字符串 std::vector parseAsStringList(const string& v, const string& sep = ","); /// 将字符串解析为一个int list /// @param v 字符串 std::vector parseAsIntList(const string& v); /// 将字符串解析为一个pair 的list /// @param v 字符串 std::vector> parseAsPairList(const string& v, const string& sep = ","); /// 将字符串解析为一个pair list /// @param v 字符串 std::vector> parseAsPairStringList(const string& v); /// 在一个标签中显示倒计时, /// @param showHours 是否显示小时位 void showTimingInLable(cocos2d::Label* label, std::function getCooldown, bool showHours = true, bool hourAlways = true); /// 解析一个时间字符串,比如 1d, 10h, 3m,2d12h30m30 等,不带单位的话认为是秒,返回单位为秒 int parseStringAsTime(const std::string& str); /// 读取适配后的资源 /// @param resName 基础的资源名称 /// @param bUseAdapt 是否使用适配 QCoreLayer* readLayer(const char* resName, bool bUseAdapt); /// 读取适配后的资源 /// @param resName 基础的资源名称 /// @param bUseAdapt 是否使用适配 /// @param reader 读取器 cocos2d::Node* readNodeWithAdapt(redream::REDReader * reader, const char* resName, bool bUseAdapt); // Json解析 Json getConfigWithName(const std::string& jsonName); // 将某个节点拉伸以适配屏幕 void smartScaleHeight(Node* layer, Size designSize); NS_RU_END #endif /* RURedUtil_h */