【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造

发布时间:2020-07-03 12:35:19 作者:kingzeus
来源:网络 阅读:4046

继续上一篇 【cocos2dx进阶】调试篇(1)基础介绍 的内容,这次主要讲下对于Cocos2dx的一些小改造。


先说Cocosdx关于调试的一些设计。主要包括2块内容,一个是log输出,一个是节点信息的反馈。


log输出


__CCLOGWITHFUNCTION可以把当前的函数名打印出来。


节点信息




又到了吐槽环节,先来说说信息输出的函数

输出函数,没啥大问题,但是输出依赖DEBUG定义,加了输出看不到才发现debug宏定义不正确。


好了,不说了。开始动手改造吧。

我们知道,Cocos2dx里面最底层的是ccobject,为了更好的调试,我们就从这里入手了

在ccobject类中添加函数:

#if (CC_TARGET_PLATFORM  ==  CC_PLATFORM_WIN32)
public:
        // 输出函数
    virtual void Dump(){}
protected:
        // 格式化输出信息
    virtual std::string dumpInfo(){return std::string();}
#endif


于是,我们就有了统一的调试函数Dump和用于格式化输出的dumpInfo。这个有啥用,不就是2个函数定义么,好吧,那我来举个例子。

就那输出节点信息来讲吧,可以参考老G的http://4137613.blog.51cto.com/4127613/1350243

要实现这个功能,其实可以

///////////////////////////
// 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
// 结束
};

重载了ccobject中的函数

///////////////////////////
// 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

补充说明下:

【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造



再来个有用的例子。

触控操作是现在手机游戏的主流方式。cocos2dx中也实现2种方式 targeted(单点)和standard(多点)。通过注册handler方式,可以方便的监听触控事件。

设计很好,但是现实总是有点小麻烦,代码一复杂之后,常常是触摸了之后,函数没有响应到,为啥,代码没有错啊,跟下吧,进入了CCTouchDispatcher.cpp之后,一阵头晕眼花,天啊,救命……

这时候,救星来了,

//////////////////////
// CCTouchDispatcher.h
// CCTouchDispatcher类添加调试的重载函数
#if (CC_TARGET_PLATFORM  ==  CC_PLATFORM_WIN32)
    virtual void Dump();
#endif

实现


#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


调用方式,在任何你需要的地方

cocos2d::CCTouchDispatcher::sharedDispatcher()->Dump();

效果如下:

【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造



好了,剩下的,就靠大家自己发挥了。下次,是对CCLOG的一些小改造。

推荐阅读:
  1. cocos2dx基础篇(4)——浅析cocos2dx引擎目录
  2. iOS开发篇Cocos2dx —场景转换

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

调试 cocos2dx进阶

上一篇:char *str1 和 char str2[]的详解

下一篇:oracle中关于替代变量,accpt,绑定变量,字符变量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》