码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-29 12:09:56      阅读:332      评论:0      收藏:0      [点我收藏+]

标签: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其实并不是线程安全的,

这点只要知道一下就行了,其实也没什么.至于喜欢用什么样的颜色去分级显示,那就自己去改吧.效果看下面的

图吧.

bubuko.com,布布扣

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!