028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造-创新互联

继续上一篇 【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]"                    <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::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::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的一些小改造。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造-创新互联
网址分享:http://www.tsicrk.com/article/dedodg.html

其他资讯

让你的专属顾问为你服务

1.4907s