-
Notifications
You must be signed in to change notification settings - Fork 5
/
GUtility.h
328 lines (294 loc) · 9.81 KB
/
GUtility.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
//
// GUtility.h
//
// Created by ldr123 on 13-3-28.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
//
#ifndef LuaToCPlusTest_GUtility_cpp
#define LuaToCPlusTest_GUtility_cpp
#include "cocos2d.h"
#include <algorithm>
#include <unordered_map>
/**
@brief: GSingletonMacro
*/
// #pragma mark -
// #pragma mark GSingletonMacro
#define SINGLETON(__TYPE__) \
private: \
__TYPE__(){} \
static __TYPE__** GetInstance() \
{ \
static __TYPE__* instance_ = nullptr; \
if(instance_ == nullptr) \
{ \
instance_ = new __TYPE__(); \
} \
return (&instance_);\
} \
public: \
static __TYPE__* ShareInstance() \
{ \
return (*__TYPE__::GetInstance()); \
} \
static void ReleaseInstance() \
{ \
__TYPE__** temp = GetInstance(); \
if(*temp) \
{ \
delete (*temp); \
*temp = nullptr; \
} \
} \
public: \
;
#define SHARE_INSTANCE(__TYPE__) \
static __TYPE__* ShareInstance() \
{ \
static __TYPE__* instance = nullptr; \
if(instance == nullptr) \
{ \
instance = new __TYPE__(); \
} \
return instance; \
} \
; \
#define PROPERTY_ASSIGN(_TYPE_,_VAR_,_FUNCNAME_,_DEFAULTVALUE_) \
public: \
_TYPE_ Get##_FUNCNAME_()const { return _VAR_; } \
void Set##_FUNCNAME_(_TYPE_ value) { _VAR_ = value; } \
protected: \
_TYPE_ _VAR_ = _DEFAULTVALUE_; \
public: \
;
/**
@brief: Debug Log Macro
*/
// #pragma mark -
// #pragma mark Debug Log Macro
#define DEBUG_GAMELOGIC
#ifdef DEBUG_GAMELOGIC
#define GLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__)
#define GCONDITIONLOG(condition, format, ...) if(condition){cocos2d::CCLog(format, ##__VA_ARGS__);}
#endif
#define DEBUG_GUI
#ifdef DEBUG_GUI
#define GUILOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__)
#define GUICONDITIONLOG(condition, format, ...) if(condition){cocos2d::CCLog(format, ##__VA_ARGS__);}
#endif
#define DEBUG_NETWORK
#ifdef DEBUG_NETWORK
#define GNETWORKLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__)
#define GNETWORKCONDITIONLOG(condition, format, ...) if(condition){cocos2d::CCLog(format, ##__VA_ARGS__);}
#endif
#define GDEBUG
#ifdef GDEBUG
#define GASSERT(myassert, format, ...) if(!myassert){cocos2d::CCLog(format, ##__VA_ARGS__);assert(false);}
#endif
struct GStdStringCompare : public std::binary_function<std::string, std::string, bool>
{
public:
bool operator() (const std::string& a, const std::string& b) const
{
return strcmp(a.c_str(), b.c_str()) < 0;
}
};
/**
@brief: 判断node是否显示 和 IsNodeNeedShow是同样的功能
*/
extern bool IsNodeShowing(cocos2d::CCNode* node);
/**
@brief: recursive check node parent visible property,if parent is disvisible then return false,else return true
*/
extern bool IsNodeNeedShow(cocos2d::CCNode* node);
/**
@brief: 判断用户的操作是否为点击操作
@param endPoint: 用户操作结束时的坐标点
@comment: 用户操作起始时的坐标点为 m_beginTouchPoint
*/
extern bool IsUserOperationIsClick(cocos2d::CCPoint& beginPoint, cocos2d::CCPoint& endPoint);
/**
@brief: 获得node的scale值
*/
extern cocos2d::CCSize GetNodeScaleValue(cocos2d::CCNode* node);
/**
* Node AnchorPos Position Convert
*/
const cocos2d::CCPoint kGAnchor_LeftTop(0.0, 1.0);
const cocos2d::CCPoint kGAnchor_LeftMid(0.0, 0.5);
const cocos2d::CCPoint kGAnchor_LeftBottom(0.0, 0.0);
const cocos2d::CCPoint kGAnchor_RightTop(1.0, 1.0);
const cocos2d::CCPoint kGAnchor_RightMid(1.0, 0.5);
const cocos2d::CCPoint kGAnchor_RightBottom(1.0, 0.0);
const cocos2d::CCPoint kGAnchor_TopMid(0.5, 1.0);
const cocos2d::CCPoint kGAnchor_Mid(0.5, 0.5);
const cocos2d::CCPoint kGAnchor_BottomMid(0.5, 0.0);
enum GENormalAnchorPosType
{
kGAnchorType_Invalid = -1,
kGAnchorType_LeftTop,
kGAnchorType_LeftMid,
kGAnchorType_LeftBottom,
kGAnchorType_RightTop,
kGAnchorType_RightMid,
kGAnchorType_RightBottom,
kGAnchorType_TopMid,
kGAnchorType_Mid,
kGAnchorType_BottomMid,
};
extern GENormalAnchorPosType ConvertARToARType(const cocos2d::CCPoint& anchor);
extern cocos2d::CCPoint GetAchorWith(GENormalAnchorPosType achorPosType);
extern cocos2d::CCPoint ConvertNodeRealARPosToGivenARPos(cocos2d::CCNode* node,
GENormalAnchorPosType givenARPosType,
bool isUseBoundingBox=true);
extern cocos2d::CCPoint ConvertNodeGivenARPosToRealARPos(cocos2d::CCNode* node,
const cocos2d::CCPoint& givenARPos,
GENormalAnchorPosType givenARPosType,
bool isUseBoundingBox=true);
extern cocos2d::CCPoint ConvertNodeGivenARPosAToB(cocos2d::CCNode* node,
const cocos2d::CCPoint& givenARPosA,
GENormalAnchorPosType givenARPosAType,
GENormalAnchorPosType givenARPosBType,
bool isUseBoundingBox=true);
extern cocos2d::CCPoint ConvertGivenARPosAToB(const cocos2d::CCSize& size,
const cocos2d::CCPoint& givenARPosA,
const cocos2d::CCPoint& givenARA,
const cocos2d::CCPoint& givenARB);
/**
@brief: GUtility
*/
// #pragma mark -
// #pragma mark GUtility
class GUtility
{
public:
//convert function
static int StringToInt(const char* str);
static float StringToFloat(const char *str);
static bool StringToBool(const std::string& str);
static std::string IntToString(int value);
static std::string FloatToString(float value);
static std::string LongLongToString(long long value);
static std::string ListIntToString(const std::list<int>& listIntegers,char splite_mark);
static bool StringToListInt(const std::string& str, char splite_mark, std::list<int>&intergerList);
static cocos2d::CCTextAlignment StringToTextAlignment(const std::string& str);
static cocos2d::CCTextAlignment StringToTextAlignment(const char* str);
static std::string CharVectorToString(const std::vector<char>* charVector);
static std::string StringVectorToString(const std::vector<std::string>& input, const std::string& spliteStr);
static char* Long2IP(unsigned long longIp);
static unsigned long IP2Long(char *ip);
static bool SplitString(const std::string& sourceStr, char splite_mark, std::vector<std::string>& splitedString);
static bool Utf8StrToStrVector(const std::string & src , std::vector<std::string>& des);
static bool ChangeFileSuffix(std::string& fileName,const std::string& newSuffix);
//compare function
static bool IsEqual(const char* str1,const char* str2);
//将字符串的前后尾空格去掉
static void TrimmedString(std::string & src);
//debug function
static void PrintVectorString(const std::vector<std::string>& string_vector);
static float GetFloatValueDecimalPart(float fValue)
{
return (fValue-(int)fValue);
}
//转为竖向字体
static std::string toVertical(const std::string horizontal);
};
template <typename ElemType>
bool EraseFirstAppearValue(std::vector<ElemType>& values,ElemType value)
{
typename std::vector<ElemType>::iterator beg = values.begin();
for (; beg!=values.end(); beg++)
{
if (value == *beg)
{
values.erase(beg);
return true;
}
}
return false;
}
template <typename ElemType>
bool EraseValue(std::vector<ElemType>& values,ElemType value)
{
typename std::vector<ElemType>::iterator tempIter = std::remove(values.begin(), values.end(), value);
if (tempIter != values.end())
{
values.erase(tempIter,values.end());
return true;
}
return false;
}
template <typename PointerType>
bool ReleasePointersInVector(std::vector<PointerType>& pointers)
{
typename std::vector<PointerType>::iterator beg = pointers.begin();
for (; beg != pointers.end(); beg++)
{
CC_SAFE_RELEASE((*beg));
}
pointers.clear();
return true;
}
template <typename PointerType>
bool DeletePointersInVector(std::vector<PointerType>& pointers)
{
typename std::vector<PointerType>::iterator beg = pointers.begin();
for (; beg != pointers.end(); beg++)
{
delete *beg;
}
pointers.clear();
return true;
}
template <typename KeyType,typename PointerValueType>
bool ReleasePointersInMap(std::unordered_map<KeyType, PointerValueType>& pointers)
{
for (auto &beg : pointers)
{
CC_SAFE_RELEASE((beg.second));
}
pointers.clear();
return true;
}
template <typename KeyType,typename PointerValueType>
bool DeletePointersInMap (std::unordered_map<KeyType, PointerValueType>& pointers)
{
for (auto &beg : pointers)
{
delete beg.second;
}
pointers.clear();
return true;
}
template <typename KeyType,typename PointerValueType>
bool DeletePointersInMultiMap (std::multimap<KeyType, PointerValueType>& pointers)
{
typename std::multimap<KeyType, PointerValueType>::iterator beg = pointers.begin();
for (; beg != pointers.end(); beg++)
{
delete beg->second;
}
pointers.clear();
return true;
}
template<typename ParentType>
ParentType GetParent(cocos2d::CCNode* node)
{
if (node)
{
cocos2d::CCNode* tempParent = node->getParent();
ParentType parent = dynamic_cast<ParentType>(tempParent);
if (parent)
{
return parent;
}
else
{
return GetParent<ParentType>(tempParent);
}
}
return nullptr;
}
//notification
#define NOTIFY_APP_EXIT "notify_app_exit"
#endif