Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2d-x 3.4 之 文字按钮与图片按钮(更新I)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************



@H_674_17@cocos2d-x 中用按钮地方很多,发现之前也没写过(其实真没什么可写的)。

@H_674_17@今天正好用到文字按钮这块,就弄了个Demo耍了下,记录一下。

@H_674_17@PS:宿舍现在是真冷啊,手冻得都哆嗦,每每睡觉前我都想到一句诗:布衾多年冷似铁。。。

@H_674_17@

@H_674_17@

@H_674_17@>>>图片按钮

@H_674_17@通过MenuItemImage来实现

@H_674_17@做一些准备工作,

@H_674_17@就是先设定一个Label,

@H_674_17@便展现按钮实现的动作:

// 为普通按钮设置的Label
	auto label1 = Label::create("Go!","fonts/Marker Felt.ttf",24);
	label1->setPosition(Vec2(visibleSize.width/2,visibleSize.height-label1->getContentSize().height*2));
	label1->setTag(10);
	this->addChild(label1);

// 为图片开关按钮设置个Label
	auto label = Label::createWithTTF("Hello World!",24);
	label->setPosition(Vec2(visibleSize.width/2+_turnOn->getContentSize().width,visibleSize.height/2));
	label->setTag(11);
	this->addChild(label);

// 为文字开关按钮设置个Label
	auto label2 = Label::createWithTTF("Hello!",24);
	label2->setPosition(Vec2(visibleSize.width/2+_turnOn->getContentSize().width,visibleSize.height/2-imageItem->getContentSize().height));
	label2->setTag(13);
	this->addChild(label2);


@H_674_17@Tag的设定,是为了在回调函数得到相应Label,从而好对它实施操作。

@H_674_17@

@H_674_17@>首先是一个简单的按钮(就是按的时候有点小变化,通过回调函数来实现动作)

void WelcomeScene::menuImgCallBACk(Ref* pSender)
{
	Label* label = (Label* )this->getChildByTag(10);
	auto actionBy = MoveBy::create(1,Vec2(80,0));
	auto actionByBACk = actionBy->reverse();
	label->runAction( Sequence::create(actionBy,actionByBACk,NULL));  
}


@H_674_17@回调函数实现的动作就是,将Label在1秒内向右移动80单位,并移动回来。



@H_674_17@>然后是开关按钮(这个就不需要解释了。。)

@H_674_17@为了简单,就直接在头文件定义:

@H_462_135@menuItemImage *_turnOn,*_turnOff;

@H_674_17@然后是按钮的制作:

// 开关按钮
    _turnOn = MenuItemImage::create(  
        "btn_musOn.png","btn_musOn.png");  
    _turnOff = MenuItemImage::create(  
        "btn_musOff.png","btn_musOff.png");  
	MenuItemToggle *switchItem = MenuItemToggle::createWithCallBACk(CC_CALLBACK_1(WelcomeScene::menuSwitchCallBACk,this),_turnOn,_turnOff,null);       
	switchItem->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2)); 


@H_674_17@它的回调函数:

void WelcomeScene::menuSwitchCallBACk(Ref* pSender)
{
	MenuItemToggle *toggleItem = (CCMenuItemToggle *)pSender;
    Label* label = (Label* )this->getChildByTag(11);
	if (toggleItem->SELEctedItem() == _turnOn){
        label->setString("Hello World!");
    }
    else if (toggleItem->SELEctedItem() == _turnOff){
        label->setString("Bye World!");
    }
}


@H_674_17@回调函数就是在 “Hello World!”和“Bye World!”之间切换。

@H_674_17@

@H_674_17@

@H_674_17@>>>接下来是文字按钮

@H_674_17@> 简单的文字按钮

@H_674_17@其实和图片按钮差不多,只不过,图片按钮用MenuItemImage,而文字按钮是用MenuItemFont

@H_75_197@// 文字按钮 auto wordItem = MenuItemFont::create("Start",CC_CALLBACK_1(WelcomeScene::menuImgCallBACk,this)); wordItem->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2+imageItem->getContentSize().height*2));

@H_674_17@回调函数和图片按钮共用一个

@H_674_17@

@H_674_17@> 文字开关按钮

@H_674_17@殊途同归,原理差不多

_turnOn1 = MenuItemFont::create("On");
	_turnOff1 = MenuItemFont::create("Off");
	MenuItemToggle *switchItem1 = MenuItemToggle::createWithCallBACk(CC_CALLBACK_1(WelcomeScene::menuSwitchCallBACk1,_turnOn1,_turnOff1,null);
	switchItem1->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2-imageItem->getContentSize().height));


@H_674_17@回调函数:

void WelcomeScene::menuSwitchCallBACk1(Ref* pSender)
{
	MenuItemToggle *toggleItem = (CCMenuItemToggle *)pSender;
    Label* label = (Label* )this->getChildByTag(13);
	if (toggleItem->SELEctedItem() == _turnOn1){
        label->setString("Hello!");
    }
    else if (toggleItem->SELEctedItem() == _turnOff1){
        label->setString("Bye!");
    }
}


@H_674_17@-------------------------------------------------------------更新---------------------------------------------------------------------------------------

@H_674_17@这里主要是对于文字开关按钮的改动,

@H_674_17@有时候为了一个无用的按钮,还要在全局设置一个变量,比较麻烦切不爽的,

@H_674_17@所以可以用下面这种方法生成 On and Off的开关按钮:

@H_109_264@menuItemFont::setFontName("fonts/Marker Felt.ttf"); MenuItemFont::setFontSize(34); MenuItemToggle *switchItem1 = MenuItemToggle::createWithCallBACk(CC_CALLBACK_1(WelcomeScene::menuSwitchCallBACk1,MenuItemFont::create("On"),MenuItemFont::create("Off"),NULL ); switchItem1->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2-imageItem->getContentSize().height));

@H_674_17@这样就不需要额外的设置两个MenuItemFont的全局变量了,

@H_674_17@但如果这样,我们回调函数就会出问题了,

@H_674_17@原来回调函数是这样的

void WelcomeScene::menuSwitchCallBACk1(Ref* pSender)
{
	MenuItemToggle *toggleItem = (CCMenuItemToggle *)pSender;
    Label* label = (Label* )this->getChildByTag(13);
	if (toggleItem->SELEctedItem() == _turnOn1){
        label->setString("Hello!");
    }
    else if (toggleItem->SELEctedItem() == _turnOff1){
        label->setString("Bye!");
    }
}


@H_674_17@没有了全局变量_turnOn1 和 _turnOff1 如何判断当前的按钮是哪个呢?

@H_674_17@——这里有个新函数——getSELEctedIndex

@H_674_17@对于MenuItemToogle::createWithCallBACk,追踪到定义,可以发现:

static MenuItemToggle * createWithCallBACk(const ccMenuCallBACk& callBACk,const Vector<MenuItem*>& menuItems);


@H_674_17@它的最后一个参数是一个集合,所以按钮可以是多个的,既然是Vector,就会有个Index

@H_674_17@这个getSELEctedIndex函数就是获取当前被选中的MenuItem序号,

@H_674_17@所以,我们回调函数可以这么写:

void WelcomeScene::menuSwitchCallBACk1(Ref* pSender)
{
	MenuItemToggle *toggleItem = (CCMenuItemToggle *)pSender;
    Label* label = (Label* )this->getChildByTag(13);
	switch ( toggleItem->getSELEctedIndex() )
	{
	case 0:	label->setString("Hello!");
		break;
	case 1:	label->setString("Bye!");
		break;
	default:
		break;
	}
}


@H_674_17@就是这样了~O(∩_∩)O~

@H_674_17@

@H_674_17@

@H_674_17@

********************************************

大佬总结

以上是大佬教程为你收集整理的cocos2d-x 3.4 之 文字按钮与图片按钮(更新I)全部内容,希望文章能够帮你解决cocos2d-x 3.4 之 文字按钮与图片按钮(更新I)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。