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

作者: 重症偏执抑郁症患者
发布时间:2015-07-01 16:59:45

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

 

来源:http://www.cnblogs.com/thoryan/p/3874599.html

推荐: