cocos2d-x 自定义控件中的回调函数使用

本文介绍了在cocos2d-x中如何自定义控件并设置回调函数,通过示例代码展示了如何在自定义的ScrollView类中调用另一个类的函数作为点击事件的回调,并详细说明了回调函数的成员变量设置和激活方法。
摘要由CSDN通过智能技术生成


先看一段代码:

 CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback) );

上面的代码是helloworld 中的一段,是生成一个menu按钮并当按下按钮的时候调用menuclosecallback函数。

当我们自定义一个类,比如自定义一个ScrollView类,当发生点击起事件的时候,我们希望能够调用另外一个类中的函数作为回调函数

我自己编写了一个Scrollview ,先看看它是怎么使用的,我在helloworld中的init()加入如下代码:

//-----------------------
    CCSprite * sp1 = CCSprite::create("HelloWorld.png");
    CCSprite * sp2 = CCSprite::create("HelloWorld.png");
    sp1->setColor(ccc3(102,102,102));
    MScrollView * tmp = MScrollView::CreateWithSprite(100,sp1,sp2,NULL);
   
    tmp->initGapForChild(10.0f);
    
    tmp->SetCallBack(callfunc_selector(HelloWorld::callback));
    
    this->addChild(tmp);


下面的代码是将Helloworld 中的callback函数当做Scrollworld 单击时的回调函数

 tmp->SetCallBack(callfunc_selector(HelloWorld::callback));

回调函数是这样写的

 void HelloWorld::callback()
{
        CCLog("````````````````call back````````````` ");
}

自定义的scrollview 中是这样写的

添加2个成员变量

 SEL_CallFunc m_fun;

 CCObject*       m_pListener;


当需要调用回调函数的时候

 if (off < TOUCH_DELTA)
    {
        //触发点击事件
        //触发回调函数
        this->activate();
        
        CCLog("touchclick");
       
    }
    else
    {
        //  滑动纠正
        //触发滑动动画
        RAnimation(ccpSub(m_touchDownPoint,m_touchUpPoint));
    }
void MScrollView::activate()
{
    (m_pListener->*m_fun)();
}

还有一点,
 (m_pListener->*m_fun)(回调函数的参数);


像menu中的回调函数就有一个CCObject* pSender参数,CCMenuItem的源代码中有一段

void CCMenuItem::activate()
{
    if (m_bIsEnabled)
    {
        if (m_pListener && m_pfnSelector)
        {
            (m_pListener->*m_pfnSelector)(this);
        }
        
        if (kScriptTypeNone != m_eScriptType)
        {
            CCScriptEngineManager::sharedManager()->getScriptEngine()->executeMenuItemEvent(this);
        }
    }
}


回到咱自己写的控件上,你需要改动

1.控件的变量

//点击后的回调函数
    SEL_CallFuncO m_fun;
    
    CCObject*       m_pListener;

当然这个m_plistener 可以是任何的类型包括你自定义的类


2. 回调函数的指向

自定义控件中修改回调函数的方法使用sel_callfunc0类型的参数

//修改一个回调函数
    void SetCallBack( SEL_CallFuncO fun){
        
        m_fun = fun;
    };

3.控件中的调用方法不变

在控件中需要使用回调函数时的代码不变,还是this->activate()触发回调

void MScrollView::activate()
{
    (m_pListener->* m_fun)(this);
}

4.修改回调函数的声明

改成

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    CCLog("````````````````menuCloseCallback page is ````````````` ");
}

5.修改自定义控件的使用方法

 CCSprite * sp1 = CCSprite::create("HelloWorld.png");
    CCSprite * sp2 = CCSprite::create("HelloWorld.png");
    sp1->setColor(ccc3(102,102,102));
    MScrollView * tmp = MScrollView::CreateWithSprite(100,sp1,sp2,NULL);
   
    tmp->initGapForChild(10.0f);
    
    tmp->SetCallBack(callfuncO_selector(HelloWorld::menuCloseCallback));
    // tmp->setContentSize(CCSizeMake(480, 320));
   // tmp->setClipSize(480, 320);

   // tmp->setPosition(CCPointZero);
    
    this->addChild(tmp);

最后附上代码:http://download.csdn.net/detail/u011405562/5849041









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值