繼續(xù)上一篇 【cocos2dx進階】調(diào)試篇(1)基礎(chǔ)介紹 的內(nèi)容,這次主要講下對于Cocos2dx的一些小改造。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供卓資網(wǎng)站建設(shè)、卓資做網(wǎng)站、卓資網(wǎng)站設(shè)計、卓資網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、卓資企業(yè)網(wǎng)站模板建站服務(wù),十余年卓資做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。先說Cocosdx關(guān)于調(diào)試的一些設(shè)計。主要包括2塊內(nèi)容,一個是log輸出,一個是節(jié)點信息的反饋。
log輸出
其實核心函數(shù)是cocos2d::CCLog直接調(diào)用的話,都會輸出信息來的。這個函數(shù)提供了對平臺函數(shù)的封裝,有需要的同學(xué)可以查看相關(guān)的平臺代碼。
然后,有同學(xué)想說,我的輸出需要分級,然后僅在debug下工作,于是,就有了下面這些擴展出來的宏定義
#define __CCLOGWITHFUNCTION(s, ...) \ CCLog("%s : %s",__FUNCTION__, CCString::createWithFormat(s, ##__VA_ARGS__)->getCString()) // cocos2d debug #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 #define CCLOG(...) #define CCLOGINFO(...) #define CCLOGERROR(...) #define CCLOGWARN(...) #elif COCOS2D_DEBUG == 1 #define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGERROR(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGINFO(format,...) do {} while (0) #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__) #elif COCOS2D_DEBUG > 1 #define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGERROR(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGINFO(format,...) cocos2d::CCLog(format, ##__VA_ARGS__) #define CCLOGWARN(...) __CCLOGWITHFUNCTION(__VA_ARGS__) #endif // COCOS2D_DEBUG
__CCLOGWITHFUNCTION可以把當(dāng)前的函數(shù)名打印出來。
節(jié)點信息
Cocos2dx為了更方便的輸出調(diào)試信息,增加了description函數(shù)
// 早期版本 char * description(); // 3.0 beta virtual std::string getDescription() const;
配合上面的輸出函數(shù),可以很方便的顯示相關(guān)信息
又到了吐槽環(huán)節(jié),先來說說信息輸出的函數(shù)
早期的版本,返回char*,但是引入了內(nèi)存泄露,雖然是調(diào)試信息,但是總有點那啥不是。
description函數(shù)不是繼承的,有些類有,有些沒有,于是,好尷尬。3.0以后改了,終于那啥了。
description還是只有ccnode的繼承鏈上才能用,有點限制啊,其他地方得自己動手了。
輸出函數(shù),沒啥大問題,但是輸出依賴DEBUG定義,加了輸出看不到才發(fā)現(xiàn)debug宏定義不正確。
好了,不說了。開始動手改造吧。
我們知道,Cocos2dx里面最底層的是ccobject,為了更好的調(diào)試,我們就從這里入手了
在ccobject類中添加函數(shù):
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) public: // 輸出函數(shù) virtual void Dump(){} protected: // 格式化輸出信息 virtual std::string dumpInfo(){return std::string();} #endif
調(diào)用Dump,用于輸出調(diào)試內(nèi)容
dumpInfo用于Dump內(nèi)部獲取需要顯示的信息
于是,我們就有了統(tǒng)一的調(diào)試函數(shù)Dump和用于格式化輸出的dumpInfo。這個有啥用,不就是2個函數(shù)定義么,好吧,那我來舉個例子。
就那輸出節(jié)點信息來講吧,可以參考老G的http://4137613.blog.51cto.com/4127613/1350243
要實現(xiàn)這個功能,其實可以
/////////////////////////// // ccnode.h /////////////////////////// class CC_DLL CCNode : public CCObject { // 略過其他,在類最下面添加 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) public: virtual void Dump(); protected: void dump(int); virtual std::string dumpInfo(); #endif // 結(jié)束 };
重載了ccobject中的函數(shù)
/////////////////////////// // ccnode.cpp /////////////////////////// #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) void CCNode::Dump() { CCLog("==================== dump ===================="); dump(0); CCLog("=============================================="); } std::string CCNode::dumpInfo() { std::stringstream ss; ss <<"[type]" <<typeid(this).name() <<" [tag]" <<getTag() <<" [visible]" <<getIsVisible() <<" [postion]" <<getPositionX()<<","<<getPositionY(); return ss.str(); } void CCNode::dump( int index) { std::string info(dumpInfo()); std::string strStruct; for(int i=0;i<index;++i) strStruct+="| "; strStruct+="+ - "; CCLog("%s%s",strStruct.c_str(),info.c_str()); if(m_pChildren && m_pChildren->count() > 0) { // draw children zOrder < 0 ccArray *arrayData = m_pChildren->data; for(int i=0 ; i < arrayData->num; i++ ) { CCNode* pNode = (CCNode*) arrayData->arr[i]; if ( pNode) { pNode->dump(index +1); } } } } #endif
補充說明下:
dump(
int
)函數(shù)是用來遞歸調(diào)用的,index表示深度
typeid 是操作符,用于獲知一個變量的具體類型。VS編譯shi時需要啟用運行時類型信息和C++異常
如果不滿意ccnode通用的輸出內(nèi)容,可以通過重載dumpInfo,定制輸出內(nèi)容
再來個有用的例子。
觸控操作是現(xiàn)在手機游戲的主流方式。cocos2dx中也實現(xiàn)2種方式 targeted(單點)和standard(多點)。通過注冊handler方式,可以方便的監(jiān)聽觸控事件。
設(shè)計很好,但是現(xiàn)實總是有點小麻煩,代碼一復(fù)雜之后,常常是觸摸了之后,函數(shù)沒有響應(yīng)到,為啥,代碼沒有錯啊,跟下吧,進入了CCTouchDispatcher.cpp之后,一陣頭暈眼花,天啊,救命……
這時候,救星來了,
////////////////////// // CCTouchDispatcher.h // CCTouchDispatcher類添加調(diào)試的重載函數(shù) #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) virtual void Dump(); #endif
實現(xiàn)
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) void CCTouchDispatcher::Dump() { CCLog("========= dump for CCTouchDispatcher ========="); // optimization to prevent a mutable copy when it is not necessary unsigned int uTargetedHandlersCount = m_pTargetedHandlers->count(); unsigned int uStandardHandlersCount = m_pStandardHandlers->count(); CCLog("TargetedHandlersCount=%d",uTargetedHandlersCount); CCLog("StandardHandlersCount=%d",uStandardHandlersCount); // // process the target handlers 1st // if (uTargetedHandlersCount > 0) { CCLog("========= Targeted Handlers"); CCTargetedTouchHandler *pHandler; CCMutableArray<CCTouchHandler*>::CCMutableArrayIterator arrayIter; for (arrayIter = m_pTargetedHandlers->begin(); arrayIter != m_pTargetedHandlers->end(); ++arrayIter) { pHandler = (CCTargetedTouchHandler *)(*arrayIter); if (! pHandler) break; CCLog("[%d]%s,SwallowsTouches=%d",pHandler->getPriority(),typeid(*(pHandler->getDelegate())).name(),pHandler->isSwallowsTouches()); } } // // process standard handlers 2nd // if (uStandardHandlersCount > 0 ) { CCLog("========= Standard Handlers"); CCMutableArray<CCTouchHandler*>::CCMutableArrayIterator iter; CCStandardTouchHandler *pHandler; for (iter = m_pStandardHandlers->begin(); iter != m_pStandardHandlers->end(); ++iter) { pHandler = (CCStandardTouchHandler*)(*iter); if (! pHandler) { break; } CCLog("[%d]%s",pHandler->getPriority(),typeid(*(pHandler->getDelegate())).name()); } } CCLog("=============================================="); } #endif
調(diào)用方式,在任何你需要的地方
cocos2d::CCTouchDispatcher::sharedDispatcher()->Dump();
效果如下:
好了,剩下的,就靠大家自己發(fā)揮了。下次,是對CCLOG的一些小改造。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
名稱欄目:【cocos2dx進階】調(diào)試篇(2)Cocos2dx的一些小改造-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article16/dedodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、域名注冊、ChatGPT、微信公眾號、定制開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)