先看一段代码:
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)(回调函数的参数);
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