*因此如下是符合要求的:
---------------------------------------- --obj的动画管理器,提供对某个obj的诸动画资源进行管理,包括暂停、播放等其他的操作 ObjAnimMgr = class("ObjAnimMgr") --------------------------------------------------public function ObjAnimMgr:ctor() --动画所属的父节点(obj) self.__parentObj = nil --cocos2d-x中动画的armature对象(如需要获得请通过getArmature()) self.__armature = nil --cocos2d-x中动画的animation对象(get from armature)(如需要获得请通过getAnimation()) self.__animation = nil --帧事件回调函数列表 self.__frameEventCallback = {} --动作播放完回调函数列表 self.__animOverCallback = {} end*而如下的代码是不符合要求的:
---------------------------------------- --obj的动画管理器,提供对某个obj的诸动画资源进行管理,包括暂停、播放等其他的操作 ObjAnimMgr = class("ObjAnimMgr") --------------------------------------------------public function ObjAnimMgr:ctor() end function ObjAnimMgr:someFunc() if nil == self.frameEventCallback then self.frameEventCallback = {} end --do others end--
--计时调度器更新函数 function ClientTimer:__updateScheduler() --检查移除池并移除其中的scheduler for k, v in pairs(self.__delayRemovePool) do self.__schedulerTbl[v] = nil end self.__delayRemovePool = {} --检查增加池并增加其中的scheduler for k, v in pairs(self.__delayAddPool) do local schedulerInfo = { isAlive = true, elapsed = 0.0, interval = v.interval, func = v.func, timerType = v.timerType, paused = v.paused, calledTime = 0, removeFunc = v.removeFunc,} self.__schedulerTbl[v.id] = schedulerInfo end self.__delayAddPool = {} --scheduler tick for schedulerId, schedulerInfo in pairs(self.__schedulerTbl) do if (not schedulerInfo.paused) and schedulerInfo.isAlive then --未被暂停,需要tick local dt = self:getDeltaSec(schedulerInfo.timerType) schedulerInfo.elapsed = schedulerInfo.elapsed + dt if schedulerInfo.elapsed > schedulerInfo.interval then --到了触发时间,触发 schedulerInfo.elapsed = 0.0 --调用次数累加 schedulerInfo.calledTime = schedulerInfo.calledTime + 1 schedulerInfo.func(dt) end end end end***************
function ObjAnimMgr:ctor() --动画所属的父节点(obj) self.__parentObj = nil --cocos2d-x中动画的armature对象(如需要获得请通过getArmature()) self.__armature = nil --cocos2d-x中动画的animation对象(get from armature)(如需要获得请通过getAnimation()) self.__animation = nil --帧事件回调函数列表 self.__frameEventCallback = {} --动作播放完回调函数列表 self.__animOverCallback = {} end
<span style="white-space:pre"> </span>--全局暂停,将暂停整个时间管理器(而不是单个时间线),用于暂停按钮 function ClientTimer:globalPause() self.__lastPauseBeginTime = socket.gettime() self.__paused = true cc.Director:getInstance():pause() end*而复杂的接口(比如功能复杂或者参数较多或行为有一定的不确定性)则需要更详细的说明,如:
--------------------------------------------- --公有方法 --功能: 创建计时调度器 --参数func: 计时回调函数 --参数intervalTime: 计时时长 --参数tag: 调度器所属的时间线 --参数removeFunc: 该计时器被移除时的回调函数(有则调用),调用时参数为被调度器总共被调用的次数 --返回: 创建的调度器id --------------------------------------------- function ClientTimer:createScheduler(func, intervalTime, tag, removeFunc) assert(tag, "tag cannot be nil") self.__schedulerCnt = self.__schedulerCnt + 1 table.insert(self.__delayAddPool, { id = self.__schedulerCnt, func = func, interval = intervalTime, timerType = tag, paused = false, removeFunc = removeFunc,}) return self.__schedulerCnt end5.模块文件开头处,用以标示该本文件的内容(如模块的功能)、修改信息等。此部分注释能帮助他人了解到该模块的功能及维护者和版本更迭过程,从而减少一些沟通成本。
--Obj暂停管理器,考虑到本游戏需要大量暂停功能,故以管理器整合此部分代码 ObjPauseManager = class("ObjPauseManager") --others--
--该属性为私有属性,外界切勿直接调用 self.__parentObj = nil --该方法为私有方法,外界切勿直接调用 function ObjAnimMgr:__onAnimationEvent(armature, movementType, movementId) --todo end非类的属性或方法,可用 local 关键字来表明其为本地属性,从而限制外界的访问。
--该方法为本地方法,外界无法直接调用 local function importModules() --todo end封装指的是模块实现逻辑透明,只对外提供清晰确定的接口,外界不需要也不应该接触到模块内部的具体实现界只需要借助接口来完成功能调用。
--真实的入口 function ClientTimer:createScheduler(func, intervalTime, tag, removeFunc) --some code end --本函数调用createScheduler实现 function ClientTimer:createSchedulerOnce(func, intervalTime, tag, removeFunc) --some code schedulerId = self:createScheduler(cbFunc, intervalTime, tag, removeFunc) --some code end --本函数调用createScheduler实现 function ClientTimer:createObjScheduler(obj, func, intervalTime, removeFunc) --some code local schedulerId = self:createScheduler(func, intervalTime, obj:getTimerType(), removeFunc) --some code end --... --更多 --...
function moduler:sampleFunc(val) --upval1为moduler外部变量 if upval1 then --do something else --do some other end end
--c++代码,摘自天龙服务端 BOOL Login::NewLogin() { __ENTER_FUNCTION g_pDataBaseManager = new LoginDBManager(); AssertEx(g_pDataBaseManager,"分配数据库管理器失败!"); Log::SaveLog(LOGIN_LOGFILE,"new LoginDBManager ...OK"); g_pProcessManager = new ProcessManager(); AssertEx( g_pProcessManager,"分配g_pProcessManager 失败!"); Log::SaveLog( LOGIN_LOGFILE, "new ProcessManager...OK" ) ; g_pPlayerPool = new PlayerPool ; AssertEx( g_pPlayerPool,"分配g_pPlayerPool 失败!"); Log::SaveLog( LOGIN_LOGFILE, "new PlayerPool...OK" ) ; g_pPacketFactoryManager = new PacketFactoryManager ; AssertEx( g_pPacketFactoryManager,"分配g_pFacketFactoryManager 失败!") ; Log::SaveLog( LOGIN_LOGFILE, "new PacketFactoryManager...OK" ) ; g_pProcessPlayerQueue = new TurnPlayerQueue; AssertEx(g_pProcessPlayerQueue,"分配排队队列失败!"); Log::SaveLog(LOGIN_LOGFILE,"new g_pProcessPlayerQueue...OK"); // //... // }***************
--c++代码,摘自天龙服务端 LoginPlayer* pLoginPlayer = (LoginPlayer*)pPlayer ; if( pLoginPlayer==NULL ) { --报错 Assert(FALSE) ; return PACKET_EXE_CONTINUE ; } *因此如下代码是被推荐的: --时间线是否处于被暂停状态 function ClientTimer:isPauseTime(timerType) if not self.__timerTbl[timerType] then logger:warn("check pause no exist time, timerType = %s !!!", tostring(timerType)) return end --... end*如下的代码是不符合要求的:
--获得delta,其实对于所有计时器其每次delta都是一样的,这里传入计时器名只是判断其有未被暂停 function ClientTimer:getDeltaSec(timerType) if not self.__timerTbl[timerType] then --容下错误时未给出任何提示,将导致行为异常且找不到任何原因(即埋下了一个很深且难以被查找到的bug) return end --... end***************
function ObjAnimMgr:create(parent, armature) --本函数一定会在调试中被调用,且参数出错明显是代码编写错误 assert(parent and armature, "parent or armature in ObjAnimMgr:create() is nil!") local mgr = self:new() return mgr end