cocos2d-x 3.4 之 文字按钮与图片按钮ZZ

前端之家收集整理的这篇文章主要介绍了cocos2d-x 3.4 之 文字按钮与图片按钮ZZ前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


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

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

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


>>>图片按钮

通过MenuItemImage来实现

做一些准备工作,

就是先设定一个Label,

方便展现按钮实现的动作:

[cpp] view plain copy print @L_404_4@
  1. //为普通按钮设置的Label
  2. autolabel1=Label::create("Go!","fonts/MarkerFelt.ttf",24);
  3. label1->setPosition(Vec2(visibleSize.width/2,visibleSize.height-label1->getContentSize().height*2));
  4. label1->setTag(10);
  5. this->addChild(label1);

@H_404_117@
    //为图片开关按钮设置个Label
  1. autolabel=Label::createWithTTF("HelloWorld!",226)"> label->setPosition(Vec2(visibleSize.width/2+_turnOn->getContentSize().width,visibleSize.height/2));
  2. label->setTag(11);
  3. this->addChild(label);

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


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

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

    voidWelcomeScene::menuImgCallback(Ref*pSender)
  1. {
  2. Label*label=(Label*)this->getChildByTag(10);
  3. autoactionBy=MoveBy::create(1,Vec2(80,0));
  4. autoactionByBack=actionBy->reverse();
  5. label->runAction(Sequence::create(actionBy,actionByBack,NULL));
  6. }

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


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

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

    MenuItemImage*_turnOn,*_turnOff;

然后是按钮的制作:

    //开关按钮
  1. _turnOn=MenuItemImage::create(
  2. "btn_musOn.png",
  3. "btn_musOn.png");
  4. _turnOff=MenuItemImage::create(
  5. "btn_musOff.png",
  6. "btn_musOff.png");
  7. MenuItemToggle*switchItem=MenuItemToggle::createWithCallback(CC_CALLBACK_1(WelcomeScene::menuSwitchCallback,this),_turnOn,_turnOff,NULL);
  8. switchItem->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));

它的回调函数

    voidWelcomeScene::menuSwitchCallback(Ref*pSender)
  1. MenuItemToggle*toggleItem=(CCMenuItemToggle*)pSender;
  2. Label*label=(Label*)this->getChildByTag(11);
  3. if(toggleItem->selectedItem()==_turnOn){
  4. label->setString("HelloWorld!");
  5. }
  6. elseif(toggleItem->selectedItem()==_turnOff){
  7. label->setString("ByeWorld!");
  8. }
  9. 回调函数就是在 “Hello World!”和“Bye World!”之间切换。

    >>>接下来是文字按钮

    > 简单的文字按钮

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

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

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

    > 文字开关按钮

    殊途同归,原理差不多

    @H_158_502@

      _turnOn1=MenuItemFont::create("On");
    1. _turnOff1=MenuItemFont::create("Off");
    2. MenuItemToggle*switchItem1=MenuItemToggle::createWithCallback(CC_CALLBACK_1(WelcomeScene::menuSwitchCallback1,_turnOn1,_turnOff1,NULL);
    3. switchItem1->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2-imageItem->getContentSize().height));

    回调函数

      voidWelcomeScene::menuSwitchCallback1(Ref*pSender)
    1. Label*label=(Label*)this->getChildByTag(13);
    2. if(toggleItem->selectedItem()==_turnOn1){
    3. label->setString("Hello!");
    4. elseif(toggleItem->selectedItem()==_turnOff1){
    5. label->setString("Bye!");
    6. -------------------------------------------------------------更新---------------------------------------------------------------------------------------

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

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

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

        MenuItemFont::setFontName("fonts/MarkerFelt.ttf");
      1. MenuItemFont::setFontSize(34);
      2. MenuItemFont::create("On"),226)"> MenuItemFont::create("Off"),226)"> NULL);
      3. 这样就不需要额外的设置两个MenuItemFont的全局变量了,

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

        原来回调函数是这样的:

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

          ——这里有个新函数——getSelectedIndex

          对于MenuItemToogle::createWithCallback,追踪到定义,可以发现:

            staticMenuItemToggle*createWithCallback(constccMenuCallback&callback,constVector<MenuItem*>&menuItems);

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

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

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

            switch(toggleItem->getSelectedIndex())
          1. case0:label->setString("Hello!");
          2. break;
          3. case1:label->setString("Bye!");
          4. default:
          5. 就是这样了~O(∩_∩)O~

            http://blog.csdn.net/lttree********************************************

            原文链接:https://www.f2er.com/cocos2dx/341792.html

            猜你在找的Cocos2d-x相关文章