您好,登錄后才能下訂單哦!
【嘮叨】
按鈕類CCControlButton繼承于控件類CCControl。
控件類CCControl主要向子類提供了一系列的控件觸發(fā)事件。當(dāng)子控件觸發(fā)相關(guān)的事件后,就會執(zhí)行相關(guān)的控件事件回調(diào)函數(shù)。這與之前講的CCMenu中的菜單按鈕回調(diào)是類似的。
控件類CCControl主要有三個子類:
(1)開關(guān)控件CCControlSwitch
(2)滑塊控件CCControlSlider
(3)按鈕控件CCControlButton
本節(jié)講的是其子類其中之一:按鈕類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)按鈕事件回調(diào)依舊為 cccontrol_selector ,沒有使用 CC_CALLBACK_2
(4)按鈕狀態(tài) CCControlState 改為強枚舉 Control::State
// NORMAL //正常 HIGH_LIGHTED //高亮(即在內(nèi)部觸摸狀態(tài)下) DISABLED //禁用 SELECTED //選中 //
(5)按鈕事件 CCControlEvent 改為強枚舉 Control::EventType
// TOUCH_DOWN //剛剛開始觸摸按鈕時 DRAG_INSIDE //在內(nèi)部拖動時(保持觸摸狀態(tài)下) DRAG_OUTSIDE //在外部拖動時(保持觸摸狀態(tài)下) DRAG_ENTER //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下) DRAG_EXIT //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下) TOUCH_UP_INSIDE //在內(nèi)部抬起手指(保持觸摸狀態(tài)下) TOUCH_UP_OUTSIDE //在外部抬起手指(保持觸摸狀態(tài)下) TOUCH_CANCEL //取消觸點 //
(6)其他變化不大。
【CCControlButton】
按鈕控件CCControlButton,想必大家對這個再熟悉不過了吧?每個游戲基本都會用到按鈕。
一個按鈕不僅有幾種不同的按鈕狀態(tài),而且還有一些按鈕事件。另外按鈕控件CCControlButton使用的背景圖片是點九圖CCScale9Sprite,可以使得按鈕在變大的情況下,盡量保持棱角不失真。
1、按鈕狀態(tài)CCControlState
// CCControlStateNormal //正常 CCControlStateHighlighted //高亮(即在內(nèi)部觸摸狀態(tài)下) CCControlStateDisabled //禁用 CCControlStateSelected //選中 //
2、按鈕事件CCControlEvent
// CCControlEventTouchDown //剛剛開始觸摸按鈕時 CCControlEventTouchDragInside //在內(nèi)部拖動時(保持觸摸狀態(tài)下) CCControlEventTouchDragOutside //在外部拖動時(保持觸摸狀態(tài)下) CCControlEventTouchDragEnter //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下) CCControlEventTouchDragExit //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下) CCControlEventTouchUpInside //在內(nèi)部抬起手指(保持觸摸狀態(tài)下) CCControlEventTouchUpOutside //在外部抬起手指(保持觸摸狀態(tài)下) 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 { /** * 創(chuàng)建CCControlButton的三種方法 */ //使用點九圖CCScale9Sprite,按鈕中不帶標(biāo)簽CCLabel static CCControlButton* create(CCScale9Sprite* sprite); //使用標(biāo)簽label,可以是CCLabelTTF、CCLabelBMFont static CCControlButton* create(CCNode* label, CCScale9Sprite* backgroundSprite); //title:標(biāo)簽內(nèi)容 //fontName:字體資源,如 "Arial" //fontSize:字體大小,默認(rèn) 12 //內(nèi)部創(chuàng)建的標(biāo)簽為CCLabelTTF static CCControlButton* create(std::string title, const char* fontName, float fontSize); /** * 屬性設(shè)置1(在當(dāng)前CCControlState下) * getCurrentTitle , getCurrentTitleColor , * TitleLabel , BackgroundSprite , PreferredSize */ //當(dāng)前顯示的標(biāo)簽內(nèi)容,只讀getCurrentTitle CC_SYNTHESIZE_READONLY(CCString*, m_currentTitle, CurrentTitle); //當(dāng)前顯示的標(biāo)簽內(nèi)容顏色,只讀getCurrentTitleColor CC_SYNTHESIZE_READONLY_PASS_BY_REF(ccColor3B, m_currentTitleColor, CurrentTitleColor); //設(shè)置當(dāng)前CCControlState下的標(biāo)簽,set/get CC_SYNTHESIZE_RETAIN(CCNode*, m_titleLabel, TitleLabel); //設(shè)置當(dāng)前CCControlState下的背景精靈,set/get CC_SYNTHESIZE_RETAIN(CCScale9Sprite*, m_backgroundSprite, BackgroundSprite); //設(shè)置按鈕大小,若標(biāo)簽label大小大于按鈕,將自動擴(kuò)展,set/get。 //不過經(jīng)過我的測試:設(shè)置了,反而按鈕大小被固定了。沒有按照label的大小進(jìn)行自動伸展了。 CC_PROPERTY(CCSize, m_preferredSize, PreferredSize); /** * 屬性設(shè)置2(在指定CCControlState下) * setTitleLabelForState , setTitleForState , setTitleColorForState , * setTitleTTFForState , setTitleTTFSizeForState , * setTitleBMFontForState , * setBackgroundSpriteForState , setBackgroundSpriteFrameForState , getBackgroundSpriteForState */ //設(shè)置在指定CCControlState下的 字體標(biāo)簽 //若未設(shè)置標(biāo)簽,默認(rèn)為CCButtonStateNormal狀態(tài)的字體標(biāo)簽 //字體標(biāo)簽可以是CCLabelTTF、CCLabelBMFont virtual void setTitleLabelForState(CCNode* label, CCControlState state); virtual CCNode* getTitleLabelForState(CCControlState state); //設(shè)置在指定CCControlState下的 標(biāo)簽內(nèi)容 //若未設(shè)置標(biāo)簽,默認(rèn)返回CCButtonStateNormal狀態(tài)的標(biāo)簽內(nèi)容 virtual void setTitleForState(CCString* title, CCControlState state); virtual CCString* getTitleForState(CCControlState state); //設(shè)置在指定CCControlState下的 標(biāo)簽顏色 virtual void setTitleColorForState(ccColor3B color, CCControlState state); virtual const ccColor3B getTitleColorForState(CCControlState state); //############################################################################### //設(shè)置在指定CCControlState下的 標(biāo)簽為CCLabelTTF //fntFile為字體資源名,如 "Arial" virtual void setTitleTTFForState(const char* fntFile, CCControlState state); virtual const char* getTitleTTFForState(CCControlState state); //設(shè)置在指定CCControlState下的 CCLabelTTF標(biāo)簽的字體大小 virtual void setTitleTTFSizeForState(float size, CCControlState state); virtual float getTitleTTFSizeForState(CCControlState state); //############################################################################### //設(shè)置在指定CCControlState下的 標(biāo)簽為CCLabelBMFont //fntFile為字體資源名,如 *.fnt virtual void setTitleBMFontForState(const char* fntFile, CCControlState state); virtual const char * getTitleBMFontForState(CCControlState state); //############################################################################### //使用點九圖CCScale9Sprite,設(shè)置在指定CCControlState下的 背景精靈 virtual void setBackgroundSpriteForState(CCScale9Sprite* sprite, CCControlState state); //使用精靈幀CCSpriteFrame,設(shè)置在指定CCControlState下的 背景精靈 //其實在內(nèi)部實現(xiàn)的代碼,實際上是利用精靈幀spriteFrame創(chuàng)建了點九圖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); //是否高亮 }; //
【代碼實戰(zhàn)】
代碼來源于cocos2dx的官方項目TestCpp中。
1、按鈕背景(正常、高亮)
2、引入頭文件和命名空間
// #include "cocos-ext.h" using namespace cocos2d::extension; //
3、在HelloWorld.h中聲明按鈕事件的回調(diào)函數(shù)、顯示按鈕狀態(tài)的Label
// CCLabelTTF* displayLabel; //顯示按鈕狀態(tài)的label void touchDownAction(CCObject* sender, CCControlEvent controlEvent); //剛剛開始觸摸按鈕時 void touchDragInsideAction(CCObject* sender, CCControlEvent controlEvent); //在內(nèi)部拖動時(保持觸摸狀態(tài)下) void touchDragOutsideAction(CCObject* sender, CCControlEvent controlEvent); //在外部拖動時(保持觸摸狀態(tài)下) void touchDragEnterAction(CCObject* sender, CCControlEvent controlEvent); //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下) void touchDragExitAction(CCObject* sender, CCControlEvent controlEvent); //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下) void touchUpInsideAction(CCObject* sender, CCControlEvent controlEvent); //在內(nèi)部抬起手指(保持觸摸狀態(tài)下) void touchUpOutsideAction(CCObject* sender, CCControlEvent controlEvent); //在外部抬起手指(保持觸摸狀態(tài)下) void touchCancelAction(CCObject* sender, CCControlEvent controlEvent); //取消觸點 //
4、在HelloWorld.cpp的init中創(chuàng)建按鈕,并綁定按鈕事件
// bool HelloWorld::init() { if ( !CCLayer::init() ) { return false; } //獲取可視區(qū)域尺寸大小 CCSize mysize = CCDirector::sharedDirector()->getVisibleSize(); //獲取可視區(qū)域的原點位置 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); //屏幕正中心位置 CCPoint midPos = ccp(mysize.width/2, mysize.height/2); //顯示按鈕狀態(tài)的標(biāo)簽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"); //高亮背景 //按鈕中的標(biāo)簽CCLabelTTF CCLabelTTF* titleNormal = CCLabelTTF::create("Button is Normal !", "Marker Felt", 30); CCLabelTTF* titleHighlighted = CCLabelTTF::create("Button is Highlighted !", "Marker Felt", 30); //創(chuàng)建按鈕CCControlButton CCControlButton* btn = CCControlButton::create(titleNormal, bgNormal); btn->setPosition( midPos ); this->addChild(btn); //設(shè)置按鈕高亮?xí)r的狀態(tài) btn->setTitleLabelForState(titleHighlighted, CCControlStateHighlighted); //高亮標(biāo)簽 btn->setTitleColorForState(ccRED, CCControlStateHighlighted); //紅色 btn->setBackgroundSpriteForState(bgHighlighted, CCControlStateHighlighted); //高亮背景 //寫了這句話,反而大小被固定了。沒有按照label的大小進(jìn)行自動伸展了 //btn->setPreferredSize( CCSizeMake(120,40) ); //綁定事件,用于顯示按鈕狀態(tài) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDownAction), CCControlEventTouchDown); //剛剛開始觸摸按鈕時 btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragInsideAction), CCControlEventTouchDragInside); //在內(nèi)部拖動時(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragOutsideAction), CCControlEventTouchDragOutside); //在外部拖動時(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragEnterAction), CCControlEventTouchDragEnter); //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchDragExitAction), CCControlEventTouchDragExit); //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchUpInsideAction), CCControlEventTouchUpInside); //在內(nèi)部抬起手指(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchUpOutsideAction), CCControlEventTouchUpOutside); //在外部抬起手指(保持觸摸狀態(tài)下) btn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::touchCancelAction), CCControlEventTouchCancel); //取消觸點 return true; } //
5、實現(xiàn)按鈕事件的回調(diào)函數(shù)
// //剛剛開始觸摸按鈕時 void HelloWorld::touchDownAction(CCObject *senderz, CCControlEvent controlEvent) { displayLabel->setString("Touch Down"); } //在內(nèi)部拖動時(保持觸摸狀態(tài)下) void HelloWorld::touchDragInsideAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Drag Inside"); } //在外部拖動時(保持觸摸狀態(tài)下) void HelloWorld::touchDragOutsideAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Drag Outside"); } //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下) void HelloWorld::touchDragEnterAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Drag Enter"); } //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下) void HelloWorld::touchDragExitAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Drag Exit"); } //在內(nèi)部抬起手指(保持觸摸狀態(tài)下) void HelloWorld::touchUpInsideAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Touch Up Inside."); } //在外部抬起手指(保持觸摸狀態(tài)下) void HelloWorld::touchUpOutsideAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Touch Up Outside."); } //取消所有觸摸 void HelloWorld::touchCancelAction(CCObject *sender, CCControlEvent controlEvent) { displayLabel->setString("Touch Cancel"); } //
6、運行結(jié)果
7、分析與總結(jié)
(1)本來一個這么小的按鈕圖片,這么變這么大了呢?這是因為當(dāng)標(biāo)簽CCLabelTTF的大小大于按鈕大小時,按鈕就會自動進(jìn)行伸展。
(2)我明明設(shè)置了高亮狀態(tài)下,標(biāo)簽為titleHighlighted,且其標(biāo)簽內(nèi)容應(yīng)該顯示“Button is Highlighted ! ”才對呀,為什么還是“Button is Normal”?。。。好吧,這個問題我也不知道。不過字體顏色,和按鈕的背景精靈圖確實是換掉了。
(3)至于按鈕事件:
CCControlEventTouchDragEnter //拖動剛進(jìn)入內(nèi)部時(保持觸摸狀態(tài)下)
CCControlEventTouchDragExit //拖動剛離開內(nèi)部時(保持觸摸狀態(tài)下)
不知道大家有沒有觀察到呢?因為只有在正好進(jìn)入或離開按鈕內(nèi)部時才看得到效果,手一抖就變成DragInside或DragOutside了。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。