首页 > 代码库 > 写自己的游戏 - 用颜色来区分不同的log输出(cocos2d-x) 同样适用于其他游戏引擎

写自己的游戏 - 用颜色来区分不同的log输出(cocos2d-x) 同样适用于其他游戏引擎

游戏脚本化开发已经成为一种主流的趋势,伴随着产生大量的人才需求.近两年,各个游戏公司对于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 mmorpg106 {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(我现在很懒,有事情从企鹅找我.谢谢)