中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2dx基礎篇(13)——按鈕控件CCControlButton

發布時間:2020-07-09 16:24:54 來源:網絡 閱讀:13216 作者:shahdza 欄目:開發技術

【嘮叨】

    按鈕類CCControlButton繼承于控件類CCControl。

    控件類CCControl主要向子類提供了一系列的控件觸發事件。當子控件觸發相關的事件后,就會執行相關的控件事件回調函數。這與之前講的CCMenu中的菜單按鈕回調是類似的。

    控件類CCControl主要有三個子類:

        (1)開關控件CCControlSwitch 

        (2)滑塊控件CCControlSlider 

        (3)按鈕控件CCControlButton 

    本節講的是其子類其中之一:按鈕類CCControlButton


【致謝】

    http://gl.paea.cn/contents/22933f46650c8213.html


【Demo下載】

    https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6CCControlButton 


【3.x】

    (1)去掉 “CC”

    (2)對象類 CCObject 改為 Ref

    (3)按鈕事件回調依舊為 cccontrol_selector ,沒有使用 CC_CALLBACK_2

    (4)按鈕狀態 CCControlState 改為強枚舉 Control::State

//
	NORMAL            //正常
	HIGH_LIGHTED      //高亮(即在內部觸摸狀態下)
	DISABLED          //禁用
	SELECTED          //選中
//

    (5)按鈕事件 CCControlEvent 改為強枚舉 Control::EventType

//
	TOUCH_DOWN        //剛剛開始觸摸按鈕時
	DRAG_INSIDE       //在內部拖動時(保持觸摸狀態下)
	DRAG_OUTSIDE      //在外部拖動時(保持觸摸狀態下)
	DRAG_ENTER        //拖動剛進入內部時(保持觸摸狀態下)
	DRAG_EXIT         //拖動剛離開內部時(保持觸摸狀態下)
	TOUCH_UP_INSIDE   //在內部抬起手指(保持觸摸狀態下)
	TOUCH_UP_OUTSIDE  //在外部抬起手指(保持觸摸狀態下)
	TOUCH_CANCEL      //取消觸點
//


    (6)其他變化不大。




【CCControlButton】

    按鈕控件CCControlButton,想必大家對這個再熟悉不過了吧?每個游戲基本都會用到按鈕。

cocos2dx基礎篇(13)——按鈕控件CCControlButton

    一個按鈕不僅有幾種不同的按鈕狀態,而且還有一些按鈕事件。另外按鈕控件CCControlButton使用的背景圖片是點九圖CCScale9Sprite,可以使得按鈕在變大的情況下,盡量保持棱角不失真。


1、按鈕狀態CCControlState

//
	CCControlStateNormal            //正常
	CCControlStateHighlighted       //高亮(即在內部觸摸狀態下)
	CCControlStateDisabled          //禁用
	CCControlStateSelected          //選中
//


2、按鈕事件CCControlEvent

//
	CCControlEventTouchDown                 //剛剛開始觸摸按鈕時
	CCControlEventTouchDragInside           //在內部拖動時(保持觸摸狀態下)
	CCControlEventTouchDragOutside          //在外部拖動時(保持觸摸狀態下)
	CCControlEventTouchDragEnter            //拖動剛進入內部時(保持觸摸狀態下)
	CCControlEventTouchDragExit             //拖動剛離開內部時(保持觸摸狀態下)
	CCControlEventTouchUpInside             //在內部抬起手指(保持觸摸狀態下)
	CCControlEventTouchUpOutside            //在外部抬起手指(保持觸摸狀態下)
	CCControlEventTouchCancel               //取消觸點
//


3、綁定按鈕事件的方法

//
	//綁定控件事件
	addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown);
	void addTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);
	  
	//刪除控件事件
	//removeTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown);
	void removeTargetWithActionForControlEvents(CCObject* target, SEL_CCControlHandler action, CCControlEvent controlEvents);
//


4、需要引用的頭文件及命名空間

//
	#include "cocos-ext.h"              //包含cocos-ext.h頭文件
	using namespace cocos2d::extension; //引用cocos2d::extension命名空間
//


5、常用操作如下

//
class CCControlButton : public CCControl
{
/**
 *		創建CCControlButton的三種方法
 */
	//使用點九圖CCScale9Sprite,按鈕中不帶標簽CCLabel
	static CCControlButton* create(CCScale9Sprite* sprite);

	//使用標簽label,可以是CCLabelTTF、CCLabelBMFont
	static CCControlButton* create(CCNode* label, CCScale9Sprite* backgroundSprite);

	//title:標簽內容
	//fontName:字體資源,如 "Arial"
	//fontSize:字體大小,默認 12
	//內部創建的標簽為CCLabelTTF
	static CCControlButton* create(std::string title, const char* fontName, float fontSize);


/**
 *		屬性設置1(在當前CCControlState下)
 *		getCurrentTitle , getCurrentTitleColor ,
 *		TitleLabel , BackgroundSprite , PreferredSize
 */
	//當前顯示的標簽內容,只讀getCurrentTitle
	CC_SYNTHESIZE_READONLY(CCString*, m_currentTitle, CurrentTitle);

	//當前顯示的標簽內容顏色,只讀getCurrentTitleColor
	CC_SYNTHESIZE_READONLY_PASS_BY_REF(ccColor3B, m_currentTitleColor, CurrentTitleColor);

	//設置當前CCControlState下的標簽,set/get
	CC_SYNTHESIZE_RETAIN(CCNode*, m_titleLabel, TitleLabel);

	//設置當前CCControlState下的背景精靈,set/get
	CC_SYNTHESIZE_RETAIN(CCScale9Sprite*, m_backgroundSprite, BackgroundSprite);

	//設置按鈕大小,若標簽label大小大于按鈕,將自動擴展,set/get。
	//不過經過我的測試:設置了,反而按鈕大小被固定了。沒有按照label的大小進行自動伸展了。
	CC_PROPERTY(CCSize, m_preferredSize, PreferredSize);


/**
 *		屬性設置2(在指定CCControlState下)
 *		setTitleLabelForState , setTitleForState , setTitleColorForState , 
 *		setTitleTTFForState , setTitleTTFSizeForState , 
 *		setTitleBMFontForState , 
 *		setBackgroundSpriteForState , setBackgroundSpriteFrameForState , getBackgroundSpriteForState
 */
	//設置在指定CCControlState下的 字體標簽
	//若未設置標簽,默認為CCButtonStateNormal狀態的字體標簽
	//字體標簽可以是CCLabelTTF、CCLabelBMFont
	virtual void setTitleLabelForState(CCNode* label, CCControlState state);
	virtual CCNode* getTitleLabelForState(CCControlState state);


	//設置在指定CCControlState下的 標簽內容
	//若未設置標簽,默認返回CCButtonStateNormal狀態的標簽內容
	virtual void setTitleForState(CCString* title, CCControlState state);
	virtual CCString* getTitleForState(CCControlState state);


	//設置在指定CCControlState下的 標簽顏色
	virtual void setTitleColorForState(ccColor3B color, CCControlState state);
	virtual const ccColor3B getTitleColorForState(CCControlState state);

//###############################################################################

	//設置在指定CCControlState下的 標簽為CCLabelTTF
	//fntFile為字體資源名,如 "Arial"
	virtual void setTitleTTFForState(const char* fntFile, CCControlState state);
	virtual const char* getTitleTTFForState(CCControlState state);


	//設置在指定CCControlState下的 CCLabelTTF標簽的字體大小
	virtual void setTitleTTFSizeForState(float size, CCControlState state);
	virtual float getTitleTTFSizeForState(CCControlState state);

//###############################################################################

	//設置在指定CCControlState下的 標簽為CCLabelBMFont
	//fntFile為字體資源名,如 *.fnt
	virtual void setTitleBMFontForState(const char* fntFile, CCControlState state);
	virtual const char * getTitleBMFontForState(CCControlState state);

//###############################################################################

	//使用點九圖CCScale9Sprite,設置在指定CCControlState下的 背景精靈
	virtual void setBackgroundSpriteForState(CCScale9Sprite* sprite, CCControlState state);


	//使用精靈幀CCSpriteFrame,設置在指定CCControlState下的 背景精靈
	//其實在內部實現的代碼,實際上是利用精靈幀spriteFrame創建了點九圖CCScale9Sprite作為背景精靈
	virtual void setBackgroundSpriteFrameForState(CCSpriteFrame* spriteFrame, CCControlState state);


	//獲取在指定CCControlState下的 背景圖
	virtual CCScale9Sprite* getBackgroundSpriteForState(CCControlState state);


/**
 *		繼承于父類
 */
	virtual void setEnabled(bool enabled);     //是否啟用
	virtual void setSelected(bool enabled);    //是否選中
	virtual void setHighlighted(bool enabled); //是否高亮
};
//




【代碼實戰】

    代碼來源于cocos2dx的官方項目TestCpp中。



1、按鈕背景(正常、高亮)

cocos2dx基礎篇(13)——按鈕控件CCControlButton    cocos2dx基礎篇(13)——按鈕控件CCControlButton    


2、引入頭文件和命名空間

//
	#include "cocos-ext.h"
	using namespace cocos2d::extension;
//


3、在HelloWorld.h中聲明按鈕事件的回調函數、顯示按鈕狀態的Label

//
	CCLabelTTF* displayLabel; //顯示按鈕狀態的label
	void touchDownAction(CCObject* sender, CCControlEvent controlEvent);        //剛剛開始觸摸按鈕時
	void touchDragInsideAction(CCObject* sender, CCControlEvent controlEvent);  //在內部拖動時(保持觸摸狀態下)
	void touchDragOutsideAction(CCObject* sender, CCControlEvent controlEvent); //在外部拖動時(保持觸摸狀態下)
	void touchDragEnterAction(CCObject* sender, CCControlEvent controlEvent);   //拖動剛進入內部時(保持觸摸狀態下)
	void touchDragExitAction(CCObject* sender, CCControlEvent controlEvent);    //拖動剛離開內部時(保持觸摸狀態下)
	void touchUpInsideAction(CCObject* sender, CCControlEvent controlEvent);    //在內部抬起手指(保持觸摸狀態下)
	void touchUpOutsideAction(CCObject* sender, CCControlEvent controlEvent);   //在外部抬起手指(保持觸摸狀態下)
	void touchCancelAction(CCObject* sender, CCControlEvent controlEvent);      //取消觸點
//


4、在HelloWorld.cpp的init中創建按鈕,并綁定按鈕事件

//
	bool HelloWorld::init()
	{
		if ( !CCLayer::init() )
		{
			return false;
		}

	//獲取可視區域尺寸大小
		CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();
	//獲取可視區域的原點位置
		CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	//屏幕正中心位置
		CCPoint midPos = ccp(mysize.width/2, mysize.height/2);


	//顯示按鈕狀態的標簽displayLabel
		displayLabel = CCLabelTTF::create("No Event", "Marker Felt", 32);
		displayLabel->setPosition( midPos + ccp(0, 100) );
		this->addChild(displayLabel);


	//按鈕中的背景精靈CCScale9Sprite
		CCScale9Sprite* bgNormal = CCScale9Sprite::create("btnNormal.png");           //正常背景
		CCScale9Sprite* bgHighlighted = CCScale9Sprite::create("btnHighlighted.png"); //高亮背景

	//按鈕中的標簽CCLabelTTF
		CCLabelTTF* titleNormal = CCLabelTTF::create("Button is Normal !", "Marker Felt", 30);
		CCLabelTTF* titleHighlighted = CCLabelTTF::create("Button is Highlighted !", "Marker Felt", 30);


	//創建按鈕CCControlButton
		CCControlButton* btn = CCControlButton::create(titleNormal, bgNormal);
		btn->setPosition( midPos );
		this->addChild(btn);

	//設置按鈕高亮時的狀態
		btn->setTitleLabelForState(titleHighlighted, CCControlStateHighlighted);    //高亮標簽
		btn->setTitleColorForState(ccRED, CCControlStateHighlighted);               //紅色
		btn->setBackgroundSpriteForState(bgHighlighted, CCControlStateHighlighted); //高亮背景

		//寫了這句話,反而大小被固定了。沒有按照label的大小進行自動伸展了
		//btn->setPreferredSize( CCSizeMake(120,40) );

	//綁定事件,用于顯示按鈕狀態
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown);               //剛剛開始觸摸按鈕時
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragInsideAction), CCControlEventTouchDragInside);   //在內部拖動時(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragOutsideAction), CCControlEventTouchDragOutside); //在外部拖動時(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragEnterAction), CCControlEventTouchDragEnter);     //拖動剛進入內部時(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragExitAction), CCControlEventTouchDragExit);       //拖動剛離開內部時(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchUpInsideAction), CCControlEventTouchUpInside);       //在內部抬起手指(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchUpOutsideAction), CCControlEventTouchUpOutside);     //在外部抬起手指(保持觸摸狀態下)
		btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchCancelAction), CCControlEventTouchCancel);           //取消觸點

		return true;
	}
//


5、實現按鈕事件的回調函數

//
	//剛剛開始觸摸按鈕時
	void HelloWorld::touchDownAction(CCObject *senderz, CCControlEvent controlEvent)
	{
		displayLabel->setString("Touch Down");
	}

	//在內部拖動時(保持觸摸狀態下)
	void HelloWorld::touchDragInsideAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Drag Inside");
	}

	//在外部拖動時(保持觸摸狀態下)
	void HelloWorld::touchDragOutsideAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Drag Outside");
	}

	//拖動剛進入內部時(保持觸摸狀態下)
	void HelloWorld::touchDragEnterAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Drag Enter");
	}

	//拖動剛離開內部時(保持觸摸狀態下)
	void HelloWorld::touchDragExitAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Drag Exit");
	}

	//在內部抬起手指(保持觸摸狀態下)
	void HelloWorld::touchUpInsideAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Touch Up Inside.");
	}

	//在外部抬起手指(保持觸摸狀態下)
	void HelloWorld::touchUpOutsideAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Touch Up Outside.");
	}

	//取消所有觸摸
	void HelloWorld::touchCancelAction(CCObject *sender, CCControlEvent controlEvent)
	{
		displayLabel->setString("Touch Cancel");
	}
//


6、運行結果

cocos2dx基礎篇(13)——按鈕控件CCControlButton


7、分析與總結

    (1)本來一個這么小的按鈕圖片,這么變這么大了呢cocos2dx基礎篇(13)——按鈕控件CCControlButton?這是因為當標簽CCLabelTTF的大小大于按鈕大小時,按鈕就會自動進行伸展。

    (2)我明明設置了高亮狀態下,標簽為titleHighlighted,且其標簽內容應該顯示“Button is Highlighted ! ”才對呀,為什么還是“Button is Normal”?cocos2dx基礎篇(13)——按鈕控件CCControlButton。。。好吧,這個問題我也不知道。不過字體顏色,和按鈕的背景精靈圖確實是換掉了。

    (3)至于按鈕事件:

        CCControlEventTouchDragEnter     //拖動剛進入內部時(保持觸摸狀態下)

        CCControlEventTouchDragExit      //拖動剛離開內部時(保持觸摸狀態下)

        不知道大家有沒有觀察到呢?因為只有在正好進入或離開按鈕內部時才看得到效果,手一抖就變成DragInside或DragOutside了。cocos2dx基礎篇(13)——按鈕控件CCControlButton



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桦南县| 庆元县| 琼中| 如皋市| 扎兰屯市| 大邑县| 旌德县| 邢台县| 宁安市| 成武县| 汝阳县| 墨脱县| 江油市| 宿松县| 麻江县| 罗城| 吉木乃县| 红原县| 新乡市| 秭归县| 建水县| 浦城县| 武山县| 湟中县| 襄樊市| 昌黎县| 林口县| 秦安县| 元氏县| 鄂尔多斯市| 台北县| 乌兰察布市| 榕江县| 琼结县| 佛学| 新安县| 伊川县| 定南县| 新乐市| 上杭县| 德令哈市|