由於採用了控制檯顯示log就有兩個問題要解決
1. log的保存
由於沒有找到比較好的重定向方案(既要顯示到控制檯又要保存到文件)
所以改用關閉時保存來實現(這樣便不能處理異常關閉時的情況了不完美)
修改main.cpp的相應部分
#ifdef USE_WIN32_CONSOLE CHAR_INFO *chiBuffer=(CHAR_INFO*)malloc(160*9999*sizeof(CHAR_INFO)); COORD coordBufSize={0}; COORD coordBufCoord={0}; SMALL_RECT srctReadRect={0}; coordBufSize.Y = 9999; coordBufSize.X = 160; srctReadRect.Bottom = 9999; srctReadRect.Right = 160; ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE),chiBuffer,coordBufSize,coordBufCoord,&srctReadRect); FILE *out=fopen("out.log","wb");int cur=0;int s=0;char buff[3];for(int i=0;i<160*9999;i++){ wchar_t c=chiBuffer[i].Char.UnicodeChar;if(c==0){break;}if(c<127){ s=1; buff[0]=c; fwrite(&buff,sizeof(char),1,out); }elseif(c > 0x07FF){ s=2; buff[0]=0xE0 | ((c >> 12) & 0x0F); buff[1]=0x80 | ((c >> 6) & 0x3F); buff[2]=0x80 | ((c >> 0) & 0x3F); fwrite(&buff,sizeof(char),3,out); }else{ s=2; buff[0]=0x80 | ((c >> 6) & 0x1F); buff[1]=0x80 | ((c >> 0) & 0x3F); fwrite(&buff,sizeof(char),2,out); } cur+=s;if(cur>159){ fprintf(out,"\n"); cur=0; } } fflush(out); fclose(out); FreeConsole();#endif
2. log的過濾
由於log本身不是採用我們的控件之類的來實現的所以只能做到顏色標記這步了
在AppDelegate.cpp中添加綁定的註冊
綁定的代碼
#include "cocos2d_specifics.hpp"#ifdef WIN32#include <windows.h>#ifdef USE_WIN32_CONSOLE#define SETCOLOR(color) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) #else#define SETCOLOR(color) #endif#else#define NONE "\033[m" #define RED "\033[0;32;31m" #define LIGHT_RED "\033[1;31m" #define GREEN "\033[0;32;32m" #define LIGHT_GREEN "\033[1;32m" #define BLUE "\033[0;32;34m" #define LIGHT_BLUE "\033[1;34m" #define DARY_GRAY "\033[1;30m" #define CYAN "\033[0;36m" #define LIGHT_CYAN "\033[1;36m" #define PURPLE "\033[0;35m" #define LIGHT_PURPLE "\033[1;35m" #define BROWN "\033[0;33m" #define YELLOW "\033[1;33m" #define LIGHT_GRAY "\033[0;37m" #define WHITE "\033[1;37m" #endifchar *_cy_js_log_buf = NULL;void _cy_js_log(constchar *format, ...) {if (_cy_js_log_buf == NULL) { _cy_js_log_buf = (char *)calloc(sizeof(char), kMaxLogLen+1); } va_list vl; va_start(vl, format);int len = vsnprintf(_cy_js_log_buf, kMaxLogLen, format, vl); va_end(vl);if (len) {// 增加顏色控制if(strstr(_cy_js_log_buf,"@")==_cy_js_log_buf){#ifdef WIN32if(strstr(_cy_js_log_buf,"@RED@")!=NULL){ SETCOLOR(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | BACKGROUND_RED); CCLOG("JS: %s", _cy_js_log_buf+5); }elseif(strstr(_cy_js_log_buf,"@YELLOW@")!=NULL){ SETCOLOR(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | BACKGROUND_RED | BACKGROUND_GREEN); CCLOG("JS: %s", _cy_js_log_buf+8); }elseif(strstr(_cy_js_log_buf,"@GREEN@")!=NULL){ SETCOLOR(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_GREEN); CCLOG("JS: %s", _cy_js_log_buf+7); } SETCOLOR(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);#elseif(strstr(_cy_js_log_buf,"@RED@")!=NULL){ CCLOG("JS: %s%s%s",RED,_cy_js_log_buf,NONE); }elseif(strstr(_cy_js_log_buf,"@YELLOW@")!=NULL){ CCLOG("JS: %s%s%s",RED,_cy_js_log_buf,NONE); }elseif(strstr(_cy_js_log_buf,"@GREEN@")!=NULL){ CCLOG("JS: %s%s%s",RED,_cy_js_log_buf,NONE); }#endif}else{ CCLOG("JS: %s", _cy_js_log_buf); } }}JSBool _cy_log(JSContext* cx, uint32_t argc, jsval *vp){if (argc > 0) { JSString *string = NULL; JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string);if (string) { JSStringWrapper wrapper(string); _cy_js_log((char *)wrapper); } }return JS_TRUE;}void register_all_jsb_customs(JSContext* cx, JSObject* global){ JS_DefineFunction(cx, global, "log", _cy_log, 0, JSPROP_READONLY | JSPROP_PERMANENT);}
其中的顏色部分可以自行定義
對於android(logcat)部分可以忽略此設定