閱讀446 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Cocos2dx 3.0 過渡篇(七)EditBox和ControlSlider不得不說的故事

尊重原創,轉載請注明來自:star特530的CSDN博客  https://blog.csdn.net/start530/article/details/18993085

初八開始上班,我竟然能馬上進入工作狀態,真是蠻佩服自己的。

正月放假這階段發生了好多事。對我的影響很大。

消沉了好幾天,現在,我滿血滿狀態的複活了。我是 這麼容易放棄的人麼?既然舍不得,就不該輕言放棄!即使希望渺茫,還是應該努力爭取下!

程序員之路,就是應該克服各種艱難險阻,將不可能變成可能。

---------機智的少年,你要勇敢往前衝~~~嘿!~

 ---------------------------------------------------------------

這次就寫個輸入框和拖動條的結合使用吧。

也就是在EditBox中輸入數值後,ControlSlider的狀態會發生改變;拖動ControlSlider後,EditBox的數值也會發生改變。

過程如下:

1、 添加EditBoxControlSlider到場景中;

2、 當EditBox的數值發生改變時,改變ControlSlider的狀態;

3、 當ControlSlider的狀態發生改變時,改變EditBox的值。

 

代碼:

頭文件主要代碼:

  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5. #include "cocos-ext.h"  
  6.   
  7. USING_NS_CC;  
  8. USING_NS_CC_EXT;  
  9.   
  10. class HelloWorld : public cocos2d::Layer,public EditBoxDelegate  
  11. {  
  12. public:  
  13.     static cocos2d::Scene* createScene();  
  14.     virtual bool init();    
  15.       
  16.     void menuCloseCallback(Object* pSender);  
  17.       
  18.     CREATE_FUNC(HelloWorld);  
  19.   
  20.     //輸入偽托  
  21.     void editBoxEditingDidBegin(EditBox* editBox);  
  22.     void editBoxEditingDidEnd(EditBox* editBox);  
  23.     void editBoxTextChanged(EditBox* editBox, const std::string& text);  
  24.     void editBoxReturn(EditBox* editBox);  
  25.   
  26.     //滑杆回調  
  27.     void slideCallback(Object *sender, Control::EventType controlEvent);  
  28. };  
  29.   
  30. #endif // __HELLOWORLD_SCENE_H__  

1、 添加EditBoxControlSlider

  1. bool HelloWorld::init()  
  2. {  
  3.     if ( !Layer::init() )  
  4.     {  
  5.         return false;  
  6.     }  
  7.       
  8.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  9.     Point origin = Director::getInstance()->getVisibleOrigin();  
  10.       
  11.     auto label = LabelTTF::create("Hello World""Arial", 24);  
  12.     label->setPosition(Point(origin.x + visibleSize.width/2,  
  13.                             origin.y + visibleSize.height - label->getContentSize().height));  
  14.     this->addChild(label, 1);  
  15.   
  16.     //EditBox  
  17.     auto inputBox = Sprite::create("inputBox.png");//添加輸入框的背景框  
  18.     inputBox->setPosition(Point(visibleSize.width/2,visibleSize.height/3));  
  19.     this->addChild(inputBox,1);  
  20.   
  21.     EditBox* editBox = EditBox::create(Size(100, 35.0), Scale9Sprite::create());//創建EditBox,第一個參數設置輸入框的大小,第二個參數和和“九妹”相關  
  22.     editBox->setPosition(Point(visibleSize.width/2,visibleSize.height/3));  
  23. //  editBox->setPlaceHolder("請輸入數字");//設置editBox輸入為空時的顯示狀態  
  24.     editBox->setInputMode(EditBox::InputMode::NUMERIC);//輸入模式,這裏設置為數字  
  25.     editBox->setDelegate(this);//開啟委托  
  26.     editBox->setFontColor(Color3B::BLACK);//設置文字顏色  
  27.     editBox->setText("0");//設置默認顯示數字  
  28.     editBox->setTag(10);  
  29.     this->addChild(editBox,2);  
  30.   
  31.     //ControlSlider  
  32.     //創建controlSlide,第一個參數為拖動前的圖片,第二個參數為拖動後的圖片,第三個參數為拖動杆  
  33.     auto slide_control = ControlSlider::create("sliderProgress.png","sliderTrack.png","sliderThumb.png");  
  34.     slide_control->setPosition(Point(visibleSize.width/2,visibleSize.height/2));  
  35.     slide_control->setMinimumValue(0.0f);//設置最小值  
  36.     slide_control->setMaximumValue(100.0f);//設置最大值  
  37.     slide_control->setValue(0.0f);//設置初始值  
  38.     slide_control->setTag(20);  
  39.     slide_control->addTargetWithActionForControlEvents(this,cccontrol_selector(HelloWorld::slideCallback),Control::EventType::VALUE_CHANGED);//設置拖動回調      
  40.     this->addChild(slide_control,2);  
  41.   
  42.       
  43.     return true;  
  44. }  

效果如圖所示:



2、當EditBox的數值發生改變時,對editBoxTextChanged()函數裏的代碼修改如下:

  1. void HelloWorld::editBoxTextChanged(EditBox* editBox, const std::string& text)  
  2. {  
  3.     int num_int = std::atoi(text.c_str());//將字符串轉成整型  
  4.     int maxNum = 100;//因為controlSlider 的最大值為100,所以這裏輸入的值最大也不能超過100  
  5.     if(num_int > maxNum)  
  6.     {  
  7.         num_int = maxNum;  
  8.     }  
  9.   
  10.     char buf_str[16];  
  11.     sprintf(buf_str,"%d",num_int);//將int的數值放入buf_str中  
  12.     editBox->setText(buf_str);//重新設置editBox的值  
  13.       
  14.     //改變ControlSlider的值  
  15.     auto slide = (ControlSlider*)this->getChildByTag(20);//通過tag獲取controlSlider  
  16.     slide->setValue((float)num_int);//重新設置slide的值  
  17.   
  18. }  

3、 當改變ControlSlider的狀態時,對它相對應的回調函數slideCallback()函數的代碼修改如下:

  1. void HelloWorld::slideCallback(Object *sender, Control::EventType controlEvent)  
  2. {  
  3.     auto slide_control = (ControlSlider*)sender;//通過回調參數sender 獲得ControlSlider  
  4.     int current_value = slide_control->getValue();//獲取slide當前的值  
  5.   
  6.     char buf_str[16];  
  7.     sprintf(buf_str,"%d",current_value);  
  8.   
  9.     auto editBox = (EditBox*)this->getChildByTag(10);//通過tag獲得EditBox  
  10.     editBox->setText(buf_str);//設置editBox的值  
  11. }  


恩,就是這樣,效果如圖:





轉發請注明來源:

https://blog.csdn.net/start530?viewmode=contents


最後更新:2017-04-03 12:56:08

  上一篇:go Android[第三方or官方]高質量實用【組件&開源項目&框架】集合貼
  下一篇:go Cocos2dx 3.0 過渡篇(六)中文顯示的一種解決辦法