【说明】
本篇整理学习过程中用到的一些小技巧,以便之后使用,后续不断补充。
【1. Cocos2d-x 3.x截屏】
utils::captureScreen(CC_CALLBACK_2(HelloWord::screenShareEx, this), "screen.png");
【2. 获取本地时间】
// 获取UNIX时间(时间戳) std::string getUnixTime() { // 获取时间 time_t timep; time(&timep); long lTime = timep; char sTime[16] = {0}; sprintf(sTime, "%ld", lTime); return sTime; } // 获取本地时间 std::string getStandardTime() { // 获取时间 struct tm *tm; time_t timep; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) time(&timep); #else struct timeval tv; gettimeofday(&tv,NULL); timep = tv.tv_sec; #endif tm = localtime(&timep); int year = tm->tm_year + 1900; int month = tm->tm_mon + 1; int day = tm->tm_mday; int hour=tm->tm_hour; int minute=tm->tm_min; int second=tm->tm_sec; char sTime[16] = {0}; sprintf(sTime, "%04d%02d%02d%02d%02d%02d", year, month, day, hour, minute, second); return sTime; }也可以这样写:
// 获取本地时间戳 int getTimeStamp() { timeval tm; gettimeofday(&tm, NULL); return tm.tv_sec; // 单位:秒 // return tm.tv_usec; // 单位:毫秒 } //获取本地时间 { time_t t = time(NULL); tm* lt = localtime(&t); int year = lt->tm_year + 1900; // 相对1900年的过去的年数 int month = lt->tm_mon + 1; // 1月份:为0 int yday = lt->tm_yday; // 年第几天:从1开始 int mday = lt->tm_mday; // 月第几天:从1开始 int wday = lt->tm_wday; // 周第几天:从1开始 int hh = lt->tm_hour; // 时 int mm = lt->tm_min; // 分 int ss = lt->tm_sec; // 秒 printf("%d %d\n", year, month); printf("%d %d %d\n", yday, mday, wday); printf("%d %d %d\n", hh, mm, ss); }【3. Android横屏竖屏】
// 横屏 android:screenOrientation="landscape" // 竖屏 android:screenOrientation="portrait"【4. Android获取机器码】
//做应用时很多时候都得获取到每个设备的机器码 Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID) //正常情况下,你想得到设备的唯一序号, TelephonyManager.getDeviceId() 就足够了。 //但会暴露DeviceID,最好把这些id加密。加密后的序号仍然可以唯一的识别该设备, //例如,使用 String.hashCode() ,结合UUID: final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, tmPhone, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); String uniqueId = deviceUuid.toString(); //最后的deviceID可能是这样的结果: 00000000-54b3-e7c7-0000-000046bffd97
【5. 创建文件夹】
// 创建文件夹,在AssertManager里面有源码 mkdir(pszPath.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
// 具体实现代码: #include <sys/stat.h> #include <dirent.h> bool createDirectory(const std::string& dirpath) { #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) DIR *pDir = opendir(dirpath.c_str()); // 打开目录 if (!pDir) { // 如果目录不存在,则创建目录 int ret = mkdir(dirpath.c_str(), S_IRWXU|S_IRWXG|S_IRWXO); if (ret != 0 && errno != EEXIST) { return false; } } return true; #else if ((GetFileAttributesA(dirpath.c_str())) == INVALID_FILE_ATTRIBUTES) { BOOL ret = CreateDirectoryA(dirpath.c_str(), NULL); if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) { return false; } } return true; #endif }
</pre><strong><span style="font-size:18px">【6. 屏幕旋转】</span></strong><pre name="code" class="cpp">//屏幕旋转 //可以通过getDeviceOrientation和setDeviceOrientation来分别获得屏幕的朝向和设置相应的屏幕朝向。 //这个例子就是根据屏幕的朝向再通过setDeviceOrientation设置屏幕的朝向 switch (s_currentOrientation) { case CCDeviceOrientationLandscapeLeft: s_currentOrientation = CCDeviceOrientationPortrait; break; case CCDeviceOrientationPortrait: s_currentOrientation = CCDeviceOrientationPortraitUpsideDown; break; case CCDeviceOrientationPortraitUpsideDown: s_currentOrientation = CCDeviceOrientationLandscapeLeft; break; } CCDirector::shareDirector()->setDeviceOrientation(s_currentOrientation);
【7. 随机浮点数】
#define RAND_LIMIT 32767 float RandomFloat() { float r = (float)(std::rand() & (RAND_LIMIT)); r /= RAND_LIMIT; r = 2.0f * r - 1.0f; return r; }【8. 使用了scrollview出现白屏】
//用了scrollview和pageview的场景在小米,华为等手机跑显示不正常,会大部分白屏。 //把这个文件AppActivity.java里的内容改成这样 import org.cocos2dx.lib.Cocos2dxActivity; import org.cocos2dx.lib.*; public class AppActivity extends Cocos2dxActivity { public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); //glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8); glSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 8); return glSurfaceView; } }