现在的位置: 首页 > 综合 > 正文

cocos2d-x 菜鸟实习生学习篇(九) 控件篇(中)

2014年06月09日 ⁄ 综合 ⁄ 共 4525字 ⁄ 字号 评论关闭

好了,这篇博客继续讲控件。

首先先介绍一个 -x 已经封装了的功能,九妹。人云亦云,看别人这么讲,我也就这么称呼吧。

    CCScale9Sprite* nineGirl = CCScale9Sprite::create("button.png");  
    nineGirl->setContentSize(CCSize(200, 100));  
    nineGirl->setPosition(ccp(300, 200));  
    this->addChild(nineGirl); 

新建一个场景,然后添加这段代码,就能看到效果了:

稍微啰嗦一下,CCScale9Sprite,顾名思义,它是一张可拉伸的精灵

然后,button.png 是一张很小很小的图片:


然后讲第一个控件:

1、ConrolButton

//ControlButton.h
#ifndef __CONTROL_BUTTON_H__
#define __CONTROL_BUTTON_H__

#include "cocos2d.h"
#include "../../extensions/cocos-ext.h"
#include "MainMenu.h"

USING_NS_CC_EXT;

class ControlButton : public MainMenu
{
public:
	virtual bool init();
	CREATE_FUNC(ControlButton);
	CCControlButton *standardButtonWithTitle(const char * title);
};
#endif

//.cpp
#include "ControlButton.h"
#include "HelloWorldScene.h"

using namespace cocos2d;

bool ControlButton::init()
{
	bool bRet = false;
    do 
    {
	CCSize size = CCDirector::sharedDirector()->getWinSize();
		
		//添加一个数组,里面都是titile元素
	CCArray *stringArray = CCArray::create(
            ccs("Hello"),
            ccs("start530"),
            ccs("cool"),
            ccs("!"),
	    ccs("haha"),
            NULL);

	//这一步灰常神奇!!!没有它的话,背景框就无法跟button相关联
	CCNode *layer = CCNode::create();
        addChild(layer, 1);

	double total_width = 0, height = 0;
        
        // For each title in the array
        CCObject* pObj = NULL;
        CCARRAY_FOREACH(stringArray, pObj)
        {
            CCString* title = (CCString*)pObj;
            // Creates a button with this string as title,getCString 从stringArray里读取文字
            CCControlButton *button = standardButtonWithTitle(title->getCString());
            button->setPosition(ccp(total_width + button->getContentSize().width / 2, button->getContentSize().height / 2));
            layer->addChild(button);
            
            // Compute the size of the layer,计算layer的大小
            height = button->getContentSize().height;
            total_width += button->getContentSize().width;//每增加一个array里的元素,width++
        }

	//设置layer的位置
        layer->setAnchorPoint(ccp (0.5, 0.5));
        layer->setContentSize(CCSizeMake(total_width, height));
        layer->setPosition(ccp(size.width / 2.0f, size.height / 2.0f));
        
        // Add the black background,用九妹创建一个背景
        CCScale9Sprite *background = CCScale9Sprite::create("buttonBackground.png");
        background->setContentSize(CCSizeMake(total_width + 14, height + 14));
        background->setPosition(ccp(size.width / 2.0f, size.height / 2.0f));
        this->addChild(background);

	//添加mainMenu菜单
	MainMenu *mainMenu = new MainMenu();
	mainMenu->mainMenu();
	this->addChild(mainMenu);

	bRet = true;
	}while(0);

	return bRet;
}


CCControlButton *ControlButton::standardButtonWithTitle(const char * title)
{
    //Creates and return a button with a default background and title color. 
    CCScale9Sprite *backgroundButton = CCScale9Sprite::create("button.png");//按下前
    CCScale9Sprite *backgroundHighlightedButton = CCScale9Sprite::create("buttonHighlighted.png");//按下后
    
    CCLabelTTF *titleButton = CCLabelTTF::create(title, "Marker Felt", 30);//添加文字

    titleButton->setColor(ccc3(159, 168, 176));//设置文字点击前的颜色
    
    CCControlButton *button = CCControlButton::create(titleButton, backgroundButton);
    button->setBackgroundSpriteForState(backgroundHighlightedButton, CCControlStateHighlighted);
    button->setTitleColorForState(ccWHITE, CCControlStateHighlighted);//设置文字点击后的颜色
    
    return button;
}

效果如下:

2、ControlPotentiometer

bool ControlPotentiometer::init()
{
	CCSize size = CCDirector::sharedDirector()->getWinSize();

	CCNode *layer = CCNode::create();
	layer->setPosition(ccp(size.width/2,size.height/2));
	this->addChild(layer);

	double layer_width = 0; //要记得初始化,否则报错

	//add the background
	CCScale9Sprite* background = CCScale9Sprite::create("buttonBackground.png");
	background->setContentSize(CCSizeMake(80,50));
	background->setPosition(ccp(layer_width + background->getContentSize().width / 2.0f,0));
	layer->addChild(background);

	layer_width += background->getContentSize().width;//此刻layer_width的值为background框的宽

	//下面这两步 是设置显示在框里的内容,设置初始值为无
	this->setDisplayValueLabel(CCLabelTTF::create("","HelveticaNeue-Bold",30));

        m_pDisplayValueLabel->setPosition(background->getPosition());
        layer->addChild(m_pDisplayValueLabel);
		
      // Add the slider
      CCControlPotentiometer *potentiometer = CCControlPotentiometer::create("potentiometerTrack.png"
                                                                             ,"potentiometerProgress.png"
                                                                            ,"potentiometerButton.png");
	//此刻poten 的横坐标为layer_width的的宽+ 10 个像素
       potentiometer->setPosition(ccp(layer_width + 10 + potentiometer->getContentSize().width / 2, 0));

      // When the value of the slider will change, the given selector will be call
      potentiometer->addTargetWithActionForControlEvents(this, cccontrol_selector(ControlPotentiometer::onValueChange), CCControlEventValueChanged);
        
	layer->addChild(potentiometer);
        
      layer_width += potentiometer->getContentSize().width;//此刻layer_width的值为background框的宽+ poten 的宽
        
      // Set the layer size
      layer->setContentSize(CCSizeMake(layer_width, 0));//设置layer 的固定大小。宽即为上面的layer_width
      layer->setAnchorPoint(ccp (0.5f, 0.5f));
        
      // Update the value label
      this->onValueChange(potentiometer, CCControlEventValueChanged);

	//add mainMenu
	MainMenu *mainMenu = new MainMenu();
	mainMenu->mainMenu();
	this->addChild(mainMenu);
	
	return true;
}

好了,先这样。下期继续。

抱歉!评论已关闭.