cocos2d-x下拉列表实现

来源:互联网 发布:国美集团美信网络诈骗 编辑:程序博客网 时间:2024/06/05 17:21

cocos2d-x下拉列表,提供列表打开、关闭、选中内容改变时的执行方法,方便在这些时刻实现对应的逻辑

由于未在cocos2d-x官方示例中找到下拉列表,而又在游戏中需要用到,所以写了一个下拉列表,希望对大家有帮助

DropDownList.h
#ifndef _DROP_DOWN_LIST_H_#define _DROP_DOWN_LIST_H_#define ITEM_NORMAL_COLOR4B       Color4B(128, 128, 128, 255)#define ITEM_SELECTED_COLOR4B     Color4B(200, 200, 200, 255)#define ITEM_HIGHLIGHT_COLOR4B    Color4B(255, 255, 0, 255)#define ITEM_NORMAL_COLOR3B       Color3B(128, 128, 128)#define ITEM_SELECTED_COLOR3B     Color3B(200, 200, 200)#define ITEM_HIGHLIGHT_COLOR3B    Color3B(255, 255, 0)#include "cocos2d.h"#include "ui/CocosGUI.h"using std::vector;class DropDownList;//列表选项类class TextItemOfList : public cocos2d::Node{public:static TextItemOfList* create(std::string text, std::string itemBgFileName);bool init(std::string text, std::string itemBgFileName);//设置是否显示void show(bool isShow, float time=0.2f);//设置是否正常状态void setIsNomal(bool isNomal);//设置选项大小void setItemSize(cocos2d::Size size);private://点击选中回调void callbackOfClick(cocos2d::Ref*pSender);private:CC_SYNTHESIZE(bool, isSelect, IsSelect);CC_SYNTHESIZE(cocos2d::ui::Button*, textBG, ItemTextBG);CC_SYNTHESIZE(cocos2d::Label*, text, ItemText);CC_SYNTHESIZE(DropDownList*, drowDownList, DropDownList);};//选中项文本的对齐类型enum POS_TYPE{LEFT,MID,RIGHT};/*列表的委托类,在打开、关闭、改变选中项的时候执行相应的操作*若需要在打开、关闭、改变选中项时处理一些逻辑,则可以使用这个功能*要使用这功能,则需要先继承该类,然后重写覆盖,xxx->setDropDownListDelegate(this);*/class DropDownListDelegate {public://打开列表时执行virtual void onDropDownListOpen(DropDownList* dropDownList);//选中项改变时执行virtual void onChangeDropDownListSelectText(DropDownList* dropDownList) = 0;//关闭下拉列表时执行virtual void onDropDownListClose(DropDownList* dropDownList);private:};//下拉列表类class DropDownList : public cocos2d::Node{public://CREATE_FUNC(DropDownList);//选项图片背景用白色图片,若不传size,则会默认设置大小为背景大小static DropDownList* create(vector<std::string> itemTexts,std::string bgFileName,std::string itemBgFileName,std::string openListButtonFileName, cocos2d::Size size=cocos2d::Size::ZERO);bool init(vector<std::string> itemTexts, std::string bgFileName, std::string itemBgFileName, std::string openListButtonFileName, cocos2d::Size size = cocos2d::Size(100, 20));//重新设置所有列表项,以前的列表项将清除void setItems(vector<std::string> itemTexts);//重新设置所有列表项为正常非选中状态void reSetItem();//设置选中文本的对齐方式void setTextPosType(POS_TYPE TYPE);//设置下拉列表打开关闭void setIsOpenList(bool isOpen);//更新下拉列表选中文本的显示void updateShowSelectText();//设置选中列表内容字体颜色void setSelectTextColor(cocos2d::Color3B color);//设置选中列表内容字体字号void setSelectTextSize(int size);//设置列表项字体颜色void setItemsTextColor(cocos2d::Color3B color);//设置列表项字体字号void setItemsTextSize(int size);private://三角形关闭或打开列表按钮回调函数void callbackOfIsOpen(cocos2d::Ref* pSender);private:CC_SYNTHESIZE(cocos2d::Size, size, Size);CC_SYNTHESIZE(bool, isOpen, IsOpen);cocos2d::Vector<TextItemOfList*> items;CC_SYNTHESIZE(std::string, selectText, SelectText);CC_SYNTHESIZE(cocos2d::Label*, label, SelectShowLabel);CC_SYNTHESIZE(std::string, itemBGFileName, ItemBgFileName);CC_SYNTHESIZE(DropDownListDelegate*, dropDownListdelegate, DropDownListDelegate);};#endif

DropDownList.cpp
#include "DropDownList.h"USING_NS_CC;using namespace cocos2d::ui;TextItemOfList* TextItemOfList::create(std::string text, std::string itemBgFileName){TextItemOfList* object = new TextItemOfList();if (object&&object->init(text, itemBgFileName)){object->autorelease();}else{CC_SAFE_DELETE(object);}return object;}bool TextItemOfList::init(std::string text, std::string itemBgFileName){//DropDownListBG.pngif (!Node::init()){return false;}setItemTextBG(Button::create("DropDownListBG.png", "DropDownListBG.png", "DropDownListBG.png"));getItemTextBG()->addClickEventListener(CC_CALLBACK_1(TextItemOfList::callbackOfClick, this));getItemTextBG()->setColor(ITEM_NORMAL_COLOR3B);this->addChild(getItemTextBG());setItemText(Label::createWithSystemFont(text, "", 18));this->addChild(getItemText(), 5);return true;}void TextItemOfList::callbackOfClick(Ref* pSender){getDropDownList()->reSetItem();this->setIsNomal(false);if (this->getItemText()->getString() != getDropDownList()->getSelectText()){getDropDownList()->setSelectText(this->getItemText()->getString());getDropDownList()->updateShowSelectText();//文本改变时执行if (getDropDownList()->getDropDownListDelegate()){getDropDownList()->getDropDownListDelegate()->onChangeDropDownListSelectText(getDropDownList());}}}void TextItemOfList::show(bool isShow,float time){FadeTo* fadeTo = FadeTo::create(time, isShow ? 255 : 0);getItemTextBG()->runAction(fadeTo);getItemText()->runAction(fadeTo->clone());getItemTextBG()->setEnabled(isShow);}void TextItemOfList::setIsNomal(bool isNomal){getItemTextBG()->setColor(isNomal ? ITEM_NORMAL_COLOR3B : ITEM_SELECTED_COLOR3B);}void TextItemOfList::setItemSize(Size size){getItemTextBG()->setScaleX(size.width / getItemTextBG()->getContentSize().width/*, size.height / getItemTextBG()->getContentSize().height*/);getItemTextBG()->setScaleY(size.height / getItemTextBG()->getContentSize().height);}DropDownList* DropDownList::create(std::vector<std::string> itemTexts, std::string bgFileName, std::string itemBgFileName, std::string openListButtonFileName, Size size){DropDownList* object = new DropDownList();if (object&&object->init(itemTexts, bgFileName, itemBgFileName, openListButtonFileName,size)){object->autorelease();}else{CC_SAFE_DELETE(object);}return object;}bool DropDownList::init(std::vector<std::string> itemTexts, std::string bgFileName, std::string itemBgFileName, std::string openListButtonFileName, Size size){if (!Node::init()){return false;}setIsOpen(false);setDropDownListDelegate(nullptr);setSelectText("");setItemBgFileName(itemBgFileName);Sprite* bg = Sprite::create(bgFileName);this->addChild(bg);if (size.width == Size::ZERO.width && size.height == Size::ZERO.height){setSize(bg->getContentSize());}else{setSize(size);}bg->setScale(size.width / bg->getContentSize().width, size.height / bg->getContentSize().height);Button* dropButton = Button::create(openListButtonFileName);dropButton->addClickEventListener(CC_CALLBACK_1(DropDownList::callbackOfIsOpen, this));dropButton->setPositionX(bg->getContentSize().width*bg->getScaleX() / 2 - dropButton->getContentSize().width / 2);this->addChild(dropButton,10,"sanjiao");setSelectShowLabel(Label::createWithSystemFont("", "", 18));getSelectShowLabel()->setColor(Color3B(128, 64, 0));getSelectShowLabel()->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);getSelectShowLabel()->setPositionX(-bg->getContentSize().width*bg->getScaleX() / 2);this->addChild(getSelectShowLabel(), 10);setTextPosType(POS_TYPE::LEFT);setItems(itemTexts);//setIsOpenList(false);//reSetItem();return true;}void DropDownList::updateShowSelectText(){getSelectShowLabel()->setString(getSelectText());}void DropDownList::setTextPosType(POS_TYPE TYPE){switch (TYPE){case LEFT:{getSelectShowLabel()->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);getSelectShowLabel()->setPositionX(-getSize().width / 2 + getSize().width/50);}break;case MID:{getSelectShowLabel()->setAnchorPoint(Vec2::ANCHOR_MIDDLE);getSelectShowLabel()->setPosition(Vec2::ZERO);}break;case RIGHT:{getSelectShowLabel()->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);getSelectShowLabel()->setPositionX(getSize().width / 2 - getSize().width / 50);}break;default:break;}}void DropDownList::setItems(vector<std::string> itemTexts){for (auto v : items){v->removeAllChildren();v->removeFromParent();}setIsOpen(false);static_cast<Button*>(this->getChildByName("sanjiao"))->setFlippedY(false);int count = 1;for (auto text : itemTexts){TextItemOfList* item = TextItemOfList::create(text,getItemBgFileName());item->setItemSize(getSize());item->setPositionY(-item->getItemTextBG()->getContentSize().height * item->getItemTextBG()->getScaleY() * count);item->setDropDownList(this);item->show(false, 0.01f);this->addChild(item);items.pushBack(item);count++;}}void DropDownList::reSetItem(){for (auto v : items){v->setIsNomal(true);}}void DropDownList::setIsOpenList(bool isOpen){if (getIsOpen() == isOpen){return;}setIsOpen(isOpen);static_cast<Button*>(this->getChildByName("sanjiao"))->setFlippedY(getIsOpen());for (auto v : items){v->show(isOpen);}}void DropDownList::callbackOfIsOpen(Ref*pSender){setIsOpenList(!getIsOpen());//static_cast<Button*>(pSender)->setFlippedY(getIsOpen());//关闭打开执行if (getIsOpen()&&dropDownListdelegate){getDropDownListDelegate()->onDropDownListOpen(this);}else if(dropDownListdelegate){getDropDownListDelegate()->onDropDownListClose(this);}CCLOG("%d", items.size());}void DropDownList::setSelectTextColor(cocos2d::Color3B color){getSelectShowLabel()->setColor(color);}void DropDownList::setSelectTextSize(int size){getSelectShowLabel()->setSystemFontSize(size);}void DropDownList::setItemsTextColor(cocos2d::Color3B color){for (auto item : items){item->getItemText()->setColor(color);}}void DropDownList::setItemsTextSize(int size){for (auto item : items){item->getItemText()->setSystemFontSize(size);}}void DropDownListDelegate::onDropDownListOpen(DropDownList* dropDownList){}void DropDownListDelegate::onDropDownListClose(DropDownList* dropDownList){}

效果:



原创粉丝点击