cocos2d-x开发: 完善接口范例分离模块
在上一篇文章中,我阐述了一下为什么要做分离这种工作,这篇文章没什么重点,只是将上一次没有完善的工作做完.原本我想做到像Lua-tests那样子,能够一次完全显示所有的tests,然后选择要执行的test.可是后来想了一下,没必要做这么多,就简单处理了.不过对于分离处理这个目标是没有偏离的.模块代码部分主要是添加了一个控制和一个接口实现:
---------------------------------------------------------------------
-- @Author 小岩
-- @Created on 2014-12-25 19:39
-- @Brief Tests
---------------------------------------------------------------------
require "src/Tests/TestsRequired" TestsController = class("TestsController", nil)
-----------------------------------------------------------
-- ctor
function TestsController:ctor()
Logger.Info("--------------------------------------------------")
Logger.Debug(" Running Mode [" .. self.__cname .. "]" )
end
-----------------------------------------------------------
-- 单例方法
function TestsController:getInstance()
if self.instance == nil then
self.instance = TestsController.new()
end
return self.instance
end
-----------------------------------------------------------
-- 运行测试
function TestsController:runTests()
--TestsCase.new():run()
end
---------------------------------------------------------------------
-- End Of Lua File
---------------------------------------------------------------------
想要运行test,只需要在runTests方法中运行自己的test就好了.接口实现如下:
---------------------------------------------------------------------
-- @Author 小岩
-- @Created on 2014-12-25 20:06
-- @Brief 测试用例
---------------------------------------------------------------------
TestsCase = class("TestsCase", nil)
-----------------------------------------------------------
-- 输出当前测试用例的名字,子类不需要override
function TestsCase:ctor()
Logger.Info("---------------------------------------------------")
Logger.Warn(" Start TestCase [" .. self.__cname .. "]" )
end
-----------------------------------------------------------
-- 需要子类实现的接口,实现需要的业务逻辑
function TestsCase:run()
error("Error: " ..self.__cname.. ":run() method not implemented!")
end
---------------------------------------------------------------------
-- End Of Lua File
---------------------------------------------------------------------
很简单的实现,就需要过多说明什么了,仔细看看extern.lua中class的实现就明白了.我还做了一下额外的工作,也算是对之前写过的代码做了一次修改.不知道怎么回事,看以前写过的代码有的时候会很不爽,禁不住就要做一些修改和重构之类的事情,没办法,这是无药可治的毛病.logger实现,是我在c++部分写的接口,lua这边也做了一点点的封装:
---------------------------------------------------------------------
-- @Author 小岩
-- @Created on 2014-12-25 19:33
-- @Brief Log lua 封装
---------------------------------------------------------------------
Logger = {}
-----------------------------------------------------------
-- Trace
function Logger.Trace(fmt, ...)
xy.Logger.Trace(string.format(fmt, ...))
end
-----------------------------------------------------------
-- Info
function Logger.Info(fmt, ...)
xy.Logger.Info(string.format(fmt, ...))
end
-----------------------------------------------------------
-- Debug
function Logger.Debug(fmt, ...)
xy.Logger.Debug(string.format(fmt, ...))
end
-----------------------------------------------------------
-- Warn
function Logger.Warn(fmt, ...)
xy.Logger.Warn(string.format(fmt, ...))
end
-----------------------------------------------------------
-- Error
function Logger.Error(fmt, ...)
xy.Logger.Error(string.format(fmt, ...))
end
-----------------------------------------------------------
-- Fatal
function Logger.Fatal(fmt, ...)
xy.Logger.Fatal(string.format(fmt, ...))
end
---------------------------------------------------------------------
-- End Of Lua File
---------------------------------------------------------------------
相应的c++部分的代码是LogUtils.h/LogUtils.cc,我也做了跨平台部分的处理,为了不增加大家的负担,linux部分的处理我就不发出来了.我在opensuse/win7上面都是在使用,所以是没有问题的.代码如下:
#include "LogUtils.h"
#include "cocos2d.h" #if __cplusplus
extern "C" {
#endif
#include "lualib.h"
#include "lauxlib.h"
#if __cplusplus
}
#endif
enum LoggerLevel
{
TRACE_, INFO_, DEBUG_, WARN_, ERROR_, FATAL_, NUM_MAX,
};
const char* LoggerName[LoggerLevel::NUM_MAX] =
{
"[Logger.Trace]", "[Logger.Info ]", "[Logger.Debug]", "[Logger.Warn ]", "[Logger.Error]", "[Logger.Fatal]"
};
const std::string getLuastackLogMessage(lua_State* L)
{
int nargs = lua_gettop(L);
std::string logMsg;
for (int i=; i <= nargs; i++)
{
if (lua_istable(L, i))
logMsg += "table";
else if (lua_isnone(L, i))
logMsg += "none";
else if (lua_isnil(L, i))
logMsg += "nil";
else if (lua_isboolean(L, i))
{
if (lua_toboolean(L, i) != )
logMsg += "true";
else
logMsg += "false";
}
else if (lua_isfunction(L, i))
logMsg += "function";
else if (lua_islightuserdata(L, i))
logMsg += "lightuserdata";
else if (lua_isthread(L, i))
logMsg += "thread";
else
{
const char * str = lua_tostring(L, i);
if (str)
logMsg += lua_tostring(L, i);
else
logMsg += lua_typename(L, lua_type(L, i));
}
if (i!=nargs)
logMsg += "\t";
}
return logMsg;
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
WORD LoggerColor[LoggerLevel::NUM_MAX] =
{
/* intensity */FOREGROUND_INTENSITY,
/* green */FOREGROUND_GREEN,
/* cyan */FOREGROUND_GREEN|FOREGROUND_BLUE,
/* yellow */FOREGROUND_RED|FOREGROUND_GREEN,
/* red */FOREGROUND_RED,
/* red */FOREGROUND_RED,
};
void outputLogMessage(LoggerLevel level, const std::string& logMsg)
{
HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
if(INVALID_HANDLE_VALUE == hConsole) { return; }
::SetConsoleTextAttribute(hConsole, LoggerColor[level]);
cocos2d::log("%s %s", LoggerName[level], logMsg.c_str());
::SetConsoleTextAttribute(hConsole, );
return;
}
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
void outputLogMessage(LoggerLevel level, const std::string& LogMsg) {}
#else
void outputLogMessage(LoggerLevel level, const std::string& LogMsg) {}
#endif #define IMPLEMENTS_LOG_FUNCTION(NAME) \
int LogUtil_Logger_##NAME(lua_State* L) \
{ \
const std::string& logMsg = getLuastackLogMessage(L); \
outputLogMessage(LoggerLevel::NAME, logMsg); \
return ; \
} IMPLEMENTS_LOG_FUNCTION(TRACE_)
IMPLEMENTS_LOG_FUNCTION(INFO_)
IMPLEMENTS_LOG_FUNCTION(DEBUG_)
IMPLEMENTS_LOG_FUNCTION(WARN_)
IMPLEMENTS_LOG_FUNCTION(ERROR_)
IMPLEMENTS_LOG_FUNCTION(FATAL_) namespace xy
{
const luaL_Reg global_log_functions[] =
{
{"Trace", LogUtil_Logger_TRACE_},
{"Info", LogUtil_Logger_INFO_},
{"Debug", LogUtil_Logger_DEBUG_},
{"Warn", LogUtil_Logger_WARN_},
{"Error", LogUtil_Logger_ERROR_},
{"Fatal", LogUtil_Logger_FATAL_},
{NULL, NULL},
};
void register_xy_LogUtils(lua_State* L)
{
luaL_register(L, "xy.Logger", global_log_functions);
}
}
这次调整,大概减少了接近五十多行的代码,另外,在结构和代码实行上面也相应要好了很多.这一部分也算是辅助模块的实现了,接下来做通信,资源更新,资源加载策略,加解密,http验证,模块事件,UI封装部分我都会在测试模块做,最后再考虑要着手做一款什么样的游戏来玩玩,这还要看我能找到什么样的资源.最好是ARPG,复杂度会高一点.
这篇没什么,所以就说到这里吧.
cocos2d-x开发: 完善接口范例分离模块的更多相关文章
- cocos2d-x开发: 如何从项目中分离出接口范例
cocos2d-x开发,包括核心模块接口开发和脚本部分的业务逻辑实现.从上层应用需求开始说,脚本在做业务逻辑实现的时候, 很多时候都需要依赖底层的接口功能,但是不是所有的人都可以游刃有余的去明白该怎么 ...
- Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件
参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...
- 使用Flask开发简单接口(4)--借助Redis实现token验证
前言 在之前我们已开发了几个接口,并且可以正常使用,那么今天我们将继续完善一下.我们注意到之前的接口,都是不需要进行任何验证就可以使用的,其实我们可以使用 token ,比如设置在修改或删除用户信息的 ...
- 那些年,我们开发的接口之:QQ登录(OAuth2.0)
那些年,我们开发的接口之:QQ登录(OAuth2.0) 吴剑 2013-06-14 原创文章,转载必须注明出处:http://www.cnblogs.com/wu-jian 前言 开发这些年,做过很多 ...
- python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctype ...
- axis2开发webservice之编写Axis2模块(Module)
axis2中的模块化开发.能够让开发者自由的加入自己所需的模块.提高开发效率,减少开发的难度. Axis2能够通过模块(Module)进行扩展. Axis2模块至少须要有两个类,这两个类分别实现了Mo ...
- 使用Flask开发简单接口(1)--GET请求接口
前言 很多想学习接口测试的同学,可能在最开始的时候,常常会因没有可以练习的项目而苦恼,毕竟网上可以练习的接口项目不多,有些可能太简单了,有些可能又太复杂了,或者是网上一些免费接口请求次数有限制,最终导 ...
- 使用Flask开发简单接口(2)--POST请求接口
今天我们继续学习如何使用Flask开发POST接口:用户注册接口和用户登录接口. request接收参数 当我们在页面发出一个POST请求,请求传到服务器时,需要如何拿到当前请求的数据呢?在Flask ...
- 使用Flask开发简单接口(5)--数据加密处理
前言 在之前开发的接口中,我们设计把用户信息存储到数据库时,没有对数据进行加密处理,为了提高下安全性,我们今天就学习下,如何对用户数据进行加密加盐处理. MD5加密加盐 MD5加密 MD5是常用的一种 ...
随机推荐
- Http Status Code 套餐合集(转载)
1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 100(继续)请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议)请求者已要 ...
- drupal 开发笔记
“以前我在开发Java项目的时候,都需要自己设计数据库表结构,数据库表结构的设计关系到一个人开发技能的高低,而在Drupal里面,我们通常是不需要设计数据库表结构,我们要做的是创建新的内容类型,然后为 ...
- px、em、pt之间的区别与互相转换
关于px.pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之.点击查看原文(原网址已失效,这是其他站点) 这里引用的是Jor ...
- 利用open live writer工具的Metaweblog技术API接口同步到多个博客。
测试例子内容: hello world hello metaweblog hello open live writer
- 远景GIS云上线
没有发布会.没有嘉宾.没有掌声,趁着国庆假期悄悄地将系统部署到服务器上线运行. 远景GIS云(RGIS Cloud)基于自主研发的远景GIS基础平台开发,目前已实现了Shape上传和导出.符号配置.动 ...
- Storm-Concept
1. Storm集群架构 strom jar all-your-code.jar backtype.storm.MyWordCounterTopology arg1 arg2 这个命 ...
- 如何用kindle看论文
kindle的pdf显示效果向来不好,那么如何把pdf转换成mobi格式呢 可以把个人文件(pdf)发送至您的[发送至Kindle]电子邮箱时,在电子邮件的主题栏中填写"convert&qu ...
- SCCM2007日志文件
Microsoft System Center Configuration Manager 2007 中的所有客户端和站点服务器组件都将过程信息记录在单个日志文件中.您可以使用客户端和站点服务器日志文 ...
- 理解活在Iphone中的那些App (三)
App的生存环境之宏观环境 从用户需求变成一个产品形体的App,是一个曲折的过程.主要的过程大概如此,分析用户需求,从用户需求中提炼出比较重要的部分,然后结合自己的创意,将其转化成产品.投放市场,接受 ...
- CATransition:视图替换动画:子视图的增删查改
CATransition通常用于通过CALayer控制UIView内子控件的过渡动画,比如删除子控件,添加子控件,切换两个子控件等. 用于子视图的增删查改: