上篇博客写了下3.0触摸的新用法,其中有个回调函数的使用,在3.0中很多回调函数的使用都发生了改变,比如菜单,比如动作,首先来看一下菜单和按钮应该如何使用。

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
//需要包含以下的头文件,需要附加包含目录$(EngineRoot)
#include "cocos-ext.h"

USING_NS_CC;
USING_NS_CC_EXT;

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();  

	//以下俩个是回调函数
    void menuCloseCallback(cocos2d::Ref* pSender);

	void touchDown(Ref * ref,Control::EventType controlEvent);

    CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

	//创建菜单项,CC_CALLBACK_1将this和回调函数绑定在了一起,callback后边的数字代表的就是回调函数必须有的参数个数
	auto menuitem = CCMenuItemImage::create("normal.png","press.png",
		CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
	auto menu = Menu::create(menuitem,NULL);
	this->addChild(menu);

	//创建按钮
	auto label = LabelTTF::create("button","Marker Felt.ttf",32);
	auto scale9 = Scale9Sprite::create("button_normal.9.png");
	auto button = ControlButton::create(label,scale9);
	//设置高亮时候按钮的状态
	button->setBackgroundSpriteForState(Scale9Sprite::create("button_down.9.png"),Control::State::HIGH_LIGHTED);
	//设置按钮按下时候的回调函数,这里没有使用CC_CALLBACK_不知道为什么
	button->addTargetWithActionForControlEvents(this,
		cccontrol_selector(HelloWorld::touchDown), Control::EventType::TOUCH_DOWN);
	button->setPosition(Point(100,100));
	this->addChild(button);

    return true;
}

void HelloWorld::menuCloseCallback(Ref* pSender)
{
	CCLOG("press");
}

void HelloWorld::touchDown(Ref * ref,Control::EventType controlEvent)
{
	CCLOG("button");
}

以上是菜单回调函数的用法,关于菜单的使用和原来是相同的,不同的就是回调函数了,按钮设置回调函数的时候没有使用callback,而是和原来的相同,事件的类型和按钮状态的类型做了些改变,写法参照我的写法。这里需要说明一点的是扩展库的引入问题,3.0精简了项目的工程,看看你自己的工程,包括了声音库和物理引擎库以及cocos2d库,其他的库都没有包含进来,所以当你出现如下的错误时,就要按照步骤添加其他的项目进来。

3.0回调函数的新用法3.0回调函数的新用法3.0回调函数的新用法

首先需要在你的项目中添加附加的项目,我这里需要用到扩展项目,所以点击解决方案,然后添加现有的项目,找到项目的路径,我的是在E:\cocos2d-x-3.0\cocos2d-x-3.0\extensions\proj.win32,你需要用到其他的项目时,按照这个方法添加就可以了。
3.0回调函数的新用法3.0回调函数的新用法3.0回调函数的新用法

然后引入刚才导入的项目,方法如图所示,最后需要在属性处,附加包含目录。

3.0回调函数的新用法3.0回调函数的新用法

schedule的用法没有改变。

//schedule的用法没有改变
	this->schedule(schedule_selector(HelloWorld::myUpdate),2.0f);

接下来看一下CCCallFunc动作家族类的回调函数用法,3.0以后Callfunc家族的成员就剩下了CallFunc和CallFuncN了,其他的俩个可以用这俩个来实现,具体的看下吧。

//创建一个精灵来执行动作
	auto sprite = Sprite::create("sprite.png");
	sprite->setPosition(CCPoint(100,100));
	this->addChild(sprite);

	//原来的func动作类家族的四个函数只剩下了2个,其他的的俩个可以通过传递参数的形式实现
	auto action1 = CallFunc::create(CC_CALLBACK_0(HelloWorld::action1,this));
	auto action2 = CallFuncN::create(CC_CALLBACK_1(HelloWorld::action2,this));
	//实现原来的CallFuncND
	auto action3 = CallFuncN::create(CC_CALLBACK_1(HelloWorld::action3,this,10));
	//实现原来的CallFuncO
	auto action4 = CallFunc::create(CC_CALLBACK_0(HelloWorld::action4,this,sprite));
	auto action = Sequence::create(MoveBy::create(2.0f,CCPoint(150,150)),action1,action2,action3,action4,NULL);
    //执行动作
	sprite->runAction(action);
void HelloWorld::action1()
{
	CCLOG("action1");
}
void HelloWorld::action2(Node * node)
{
	CCLOG("action2");
}
void HelloWorld::action3(Node * node,int i)
{
	CCLOG("%d",i);
}
void HelloWorld::action4(Ref * ref)
{
	auto sprite = static_cast<Sprite *>(ref);
	CCLOG("x=%f y=%f",sprite->getPosition().x,sprite->getPosition().y);
}