标签:style blog http color 使用 os strong 文件
游戏脚本化开发已经成为一种主流的趋势,伴随着产生大量的人才需求.近两年,各个游戏公司对于lua程序员的需求明显是增长额有点过分了,真的是太不正常了.抛开市场化需求的东西不谈,我们谈一些技术,一些琐碎的,可有可无,非重点的技术.近几天我都在写客户端的开发框架,目的就是让LUA程序员可以使用一款自己喜欢的编辑器,版本控制工具以及部分内部工具就可以随心所欲的开发逻辑模块,这对我来说也算是满有挑战性的,不过我喜欢,反正我都是写给自己玩,又不用别人去要求什么,所以随心所欲吧,尽量做到最好.
对于cocos2d-x,触控虽然有code ide集成开发工具,可是并不支持旧版本.我现在使用的是cocos2d-x 2.2.5和cocos2d-x 3.1.当然,新版本我也并不使用codeide,不要问原因,我在前面的文章说过,那好像也是很久之前的事情了.在处理2.2.5版本framework的时候,有的时候,我在开发扩展模块的时候,明显感觉对着黑底白字的终端,感觉到眼睛受不了,及时是我去改终端窗口的颜色设置,可是还是清一色的一样颜色.让我想起多彩漂亮的ubuntu terminal,漂亮的google test输出颜色,多怀念.每天长时间的coding,眼睛总是会受不了的.所以就萌生了一个想法:自己去修改终端的log打印数据颜色.那样方便信息定位,也好看一点.总之是为了让自己舒服一点,同时也放飞一下自己的想象力.
修改终端颜色的win32 api比较好找.可是cocos2d-x lua print函数其实就是cocos2d:CCLog函数的输出,如果修改stdout,stderr的输出颜色,那么print打印到终端就是清一色的,和前面的做法也就没什么区别了.调整一下方法,自己去实现logger.我们都知道,通常自己在实现logger的时候都会有提供不同等级的log方法,
只不过,我实现的不需要写入文件,只是单纯的打印到stdout.方法也很简单,在每一等级的log方法中,打印之前就改变颜色设置,打印完就重置.这样就可以很简单的实现不同log等级的颜色显示,我相信,只要在开发的过程中,你不是个log狂人,就不会把你的终端弄得乱七八糟.下面是我写的一个小扩展,很简单,看一下就知道如何用了.
1 #include "LoggerHelper.h" 2 #include <string> 3 #include "cocos2d.h" 4 5 extern "C" { 6 #include "lauxlib.h" 7 } 8 9 namespace { 10 const std::string get_lua_print(lua_State* L) 11 { 12 int nargs = lua_gettop(L); 13 std::string lua_string; 14 for (int i=1; i <= nargs; i++) 15 { 16 if (lua_istable(L, i)) 17 lua_string += "table"; 18 else if (lua_isnone(L, i)) 19 lua_string += "none"; 20 else if (lua_isnil(L, i)) 21 lua_string += "nil"; 22 else if (lua_isboolean(L, i)) 23 { 24 if (lua_toboolean(L, i) != 0) 25 lua_string += "true"; 26 else 27 lua_string += "false"; 28 } 29 else if (lua_isfunction(L, i)) 30 lua_string += "function"; 31 else if (lua_islightuserdata(L, i)) 32 lua_string += "lightuserdata"; 33 else if (lua_isthread(L, i)) 34 lua_string += "thread"; 35 else 36 { 37 const char * str = lua_tostring(L, i); 38 if (str) 39 lua_string += lua_tostring(L, i); 40 else 41 lua_string += lua_typename(L, lua_type(L, i)); 42 } 43 if (i!=nargs) 44 lua_string += "\t"; 45 } 46 return lua_string; 47 } 48 49 enum logger_type 50 { 51 info, 52 debug, 53 warning, 54 error, 55 fatal, 56 }; 57 58 int SetConsoleColorful(logger_type type) 59 { 60 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) 61 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 62 if(hConsole==INVALID_HANDLE_VALUE) 63 return FALSE; 64 BOOL bRet = FALSE; 65 switch (type) 66 { 67 case logger_type::info: 68 bRet = SetConsoleTextAttribute(hConsole,FOREGROUND_INTENSITY|FOREGROUND_INTENSITY); 69 break; 70 case logger_type::debug: 71 bRet = SetConsoleTextAttribute(hConsole,FOREGROUND_BLUE|FOREGROUND_INTENSITY); 72 break; 73 case logger_type::warning: 74 bRet = SetConsoleTextAttribute(hConsole,FOREGROUND_GREEN|FOREGROUND_INTENSITY); 75 break; 76 case logger_type::error: 77 bRet = SetConsoleTextAttribute(hConsole,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_INTENSITY); 78 break; 79 case logger_type::fatal: 80 bRet = SetConsoleTextAttribute(hConsole,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_GREEN); 81 break; 82 } 83 return bRet; 84 #else 85 return -1; 86 #endif 87 } 88 #define IMPLEMENT_LOGGER_FUNCTION(NAME) 89 int lua_logger_##NAME(lua_State* L) 90 { 91 const std::string logInfo = get_lua_print(L); 92 SetConsoleColorful(logger_type::##NAME); 93 CCLOG("[logger-%s] %s",#NAME,logInfo.c_str()); 94 SetConsoleColorful(logger_type::info); 95 return 0; 96 } 97 98 IMPLEMENT_LOGGER_FUNCTION(info) 99 IMPLEMENT_LOGGER_FUNCTION(debug) 100 IMPLEMENT_LOGGER_FUNCTION(warning) 101 IMPLEMENT_LOGGER_FUNCTION(error) 102 IMPLEMENT_LOGGER_FUNCTION(fatal) 103 } 104 105 namespace mmorpg 106 { 107 const luaL_reg logger_global_functions [] = 108 { 109 {"logger_info",lua_logger_info}, 110 {"logger_debug",lua_logger_debug}, 111 {"logger_warning",lua_logger_warning}, 112 {"logger_error",lua_logger_error}, 113 {"logger_fatal",lua_logger_fatal}, 114 {NULL, NULL} 115 }; 116 117 void luaRegister_loggerHelper(lua_State* L) 118 { 119 luaL_register(L, "_G", logger_global_functions); 120 } 121 }
我只是添加了lua中的log函数颜色,在C++中的log函数并没有添加,因为C++部分的我就直接vs调试了,省下
很多的打印信息,而且C++还是调试更靠谱一点.打印靠不住.如果需要添加C++部分的log颜色显示,那也没
什么难的,上面的代码足够帮助你自己添加了.
另外需要说明的是,上面的代码本身是依赖cocos2d::CCLog的,而cocos2d::CCLog其实并不是线程安全的,
这点只要知道一下就行了,其实也没什么.至于喜欢用什么样的颜色去分级显示,那就自己去改吧.效果看下面的
图吧.
PS: 对于需要在C++部分添加Log分级显示的,我的意见是将SetConsoleColorful函数放到头文件去,然后
用宏去处理cocos2d::CCLog,那样只需要添加很少的代码就可以搞定了,目测不超过二十行.
对于之前的在cocos2d-x 3.1配置pbc集成的文章,最近,我已应部分网友的问题,在win32做好了集成的工作.
IOS的我年前就做过了.所以,如有需要,请大家耐心点看文章,仔细想想做法,如有难处,请企鹅询问我.
By 重症偏执抑郁症患者
QQ 505088083@qq.com
Email respawn0503@gmail.com(我现在很懒,有事情从企鹅找我.谢谢)
写自己的游戏 - 用颜色来区分不同的log输出(cocos2d-x) 同样适用于其他游戏引擎,布布扣,bubuko.com
写自己的游戏 - 用颜色来区分不同的log输出(cocos2d-x) 同样适用于其他游戏引擎
标签:style blog http color 使用 os strong 文件
原文地址:http://www.cnblogs.com/thoryan/p/3874599.html