• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            l

            成都手游碼農(nóng)一枚
            隨筆 - 32, 文章 - 0, 評(píng)論 - 117, 引用 - 0
            數(shù)據(jù)加載中……

            [cocos2d-x]分享一個(gè)簡(jiǎn)單的下拉列表控件。

            // 點(diǎn)擊,彈出,選擇,關(guān)閉。

            #ifndef DROPDOWNLIST_H_INCLUDED
            #define DROPDOWNLIST_H_INCLUDED

            namespace azl
            {

            #define DROPDOWNLIST_NORMAL_COLOR       cocos2d::ccc4(128, 128, 128, 255)
            #define DROPDOWNLIST_SELECTED_COLOR     cocos2d::ccc4(200, 200, 200, 255)
            #define DROPDOWNLIST_HIGHLIGHT_COLOR    cocos2d::ccc4(60, 60, 200, 255)

            #define DROPDOWNLIST_NORMAL_COLOR3       cocos2d::ccc3(128, 128, 128)
            #define DROPDOWNLIST_SELECTED_COLOR3     cocos2d::ccc3(200, 200, 200)
            #define DROPDOWNLIST_HIGHLIGHT_COLOR3    cocos2d::ccc3(60, 60, 200)

            class DropDownList : public cocos2d::CCLayer
            {
            public:
                class TouchHelper : public cocos2d::CCObject, public cocos2d::CCTouchDelegate
                {
                protected:
                    TouchHelper(DropDownList& list)
                        : list_(list)
                    {
                        cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, cocos2d::kCCMenuHandlerPriority, true);
                    }

                public:
                    static TouchHelper* create(DropDownList& list)
                    {
                        return new TouchHelper(list);
                    }

                    void destroy()
                    {
                        cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
                        autorelease();
                    }

                    virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
                    {
                        list_.onClose();
                        return true;
                    }

                    DropDownList& list_;
                };

            protected:
                DropDownList(cocos2d::CCLabelTTF* label, cocos2d::CCSize size)
                    : label_(label)
                    , show_(false)
                    , lastSelectedIndex_(0)
                    , helper_(NULL)
                    , item_(NULL)
                {
                    menu_ = cocos2d::CCMenu::create();
                    menu_->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
                    menu_->setVertexZ(0.1f);
                    menu_->retain();

                    label_->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
                    addChild(label_);

                    setContentSize(size);
                }

            public:
                ~DropDownList()
                {
                    menu_->release();
                }

                static DropDownList* create(cocos2d::CCLabelTTF* label, cocos2d::CCSize size)
                {
                    DropDownList* list = new DropDownList(label, size);
                    list->autorelease();
                    return list;
                }

                std::string getString()
                {
                    return label_->getString();
                }

                int getSelectedIndex()
                {
                    return lastSelectedIndex_;
                }

                void setSelectedIndex(int index)
                {
                    lastSelectedIndex_ = index;

                    for (int i = 0, j = (int)labels_.size(); i < j; ++i)
                    {
                        if (i == lastSelectedIndex_)
                        {
                            layers_[i]->setColor(DROPDOWNLIST_HIGHLIGHT_COLOR3);
                            label_->setString(labels_[i]->getString());
                        }
                        else
                        {
                            layers_[i]->setColor(DROPDOWNLIST_NORMAL_COLOR3);
                        }
                    }
                }

                void setDropMenuItem(cocos2d::CCMenuItem* item)
                {
                    CC_ASSERT(item_ == NULL);
                    item_ = item;

                    addChild(item_);

                    cocos2d::CCSize size = getContentSize();
                    item_->setAnchorPoint(cocos2d::CCPoint(1.0f, 0.5f));
                    item_->setPosition(size.width, size.height / 2.0f);

                    label_->setAnchorPoint(cocos2d::CCPoint(0.0f, 0.5f));
                    label_->setPosition(cocos2d::CCPoint(4, size.height / 2.0f));
                }

            public:
                void onEnter()
                {
                    setTouchEnabled(true);
                    cocos2d::CCLayer::onEnter();
                }

                void registerWithTouchDispatcher()
                {
                    cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
                    pDirector->getTouchDispatcher()->addTargetedDelegate(this, cocos2d::kCCMenuHandlerPriority, true);
                }

                virtual bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
                {
                    if (!show_)
                    {
                        cocos2d::CCRect rect;
                        rect.origin = cocos2d::CCPointZero;
                        rect.size = getContentSize();
                        cocos2d::CCPoint position = convertTouchToNodeSpace(touch);

                        if (rect.containsPoint(position))
                        {
                            show_ = true;
                            helper_ = TouchHelper::create(*this);
                            addChild(menu_);

                            for (int i = 0, j = (int)labels_.size(); i < j; ++i)
                            {
                                if (i == lastSelectedIndex_)
                                {
                                    layers_[i]->setColor(DROPDOWNLIST_HIGHLIGHT_COLOR3);
                                }
                                else
                                {
                                    layers_[i]->setColor(DROPDOWNLIST_NORMAL_COLOR3);
                                }
                            }

                            if (item_)
                            {
                                item_->selected();
                            }

                            return true;
                        }
                    }
                   
                    return false;
                }

                void addLabel(cocos2d::CCLabelTTF* label)
                {
                    cocos2d::CCSize size = getContentSize();

                    cocos2d::CCLayerColor* normal   = cocos2d::CCLayerColor::create(DROPDOWNLIST_NORMAL_COLOR, size.width, size.height);
                    cocos2d::CCLayerColor* selected = cocos2d::CCLayerColor::create(DROPDOWNLIST_SELECTED_COLOR, size.width, size.height);

                    layers_.push_back(normal);
                    labels_.push_back(label);
                    
                    cocos2d::CCMenuItem* item = cocos2d::CCMenuItemSprite::create(
                            normal, 
                            selected, 
                            NULL,
                            this,
                            cocos2d::SEL_MenuHandler(&DropDownList::onSelected)
                        );

                    label->setPosition(cocos2d::CCPoint(size.width / 2, size.height / 2));
                    item->addChild(label);
                    item->setTag((int)labels_.size() - 1);
                    item->setPosition(0, - (int)labels_.size() * size.height);

                    menu_->addChild(item);
                }

                void onSelected(cocos2d::CCObject* sender)
                {
                    cocos2d::CCMenuItem* item = dynamic_cast<cocos2d::CCMenuItem*>(sender);

                    if (item)
                    {
                        lastSelectedIndex_ = item->getTag();
                        label_->setString(labels_[item->getTag()]->getString());
                    }

                    onClose();
                }

                void onClose()
                {
                    removeChild(menu_, true);
                    
                    helper_->destroy();
                    helper_ = NULL;

                    show_ = false;

                    if (item_)
                    {
                        item_->unselected();
                    }
                }

            private:
                cocos2d::CCMenu* menu_;
                cocos2d::CCLabelTTF* label_;
                std::vector<cocos2d::CCLabelTTF*> labels_;
                std::vector<cocos2d::CCLayerColor*> layers_;
                bool show_;
                int lastSelectedIndex_;
                TouchHelper* helper_;
                cocos2d::CCMenuItem* item_;
            };

            }

            #endif

            posted on 2013-07-01 23:50 l1989 閱讀(5834) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): C++游戲

            評(píng)論

            # re: [cocos2d-x]分享一個(gè)簡(jiǎn)單的下拉列表控件。  回復(fù)  更多評(píng)論   

            可以用,幫樓主寫(xiě)了個(gè)test

            Says* says = Says::create();
            CCLabelTTF* labeldropdown = new CCLabelTTF();
            std::wstring tt2 = L"侵略";
            std::string text2 = says->WStrToUTF8(tt2);
            labeldropdown->initWithString(text2.c_str(), "黑體", 22);
            CCSize itemSize = CCSizeMake(80,30);
            azl::DropDownList* pdd = azl::DropDownList::create(labeldropdown,itemSize);

            CCLabelTTF* dd1 = new CCLabelTTF();
            std::wstring tt3 = L"侵略1";
            std::string text3 = says->WStrToUTF8(tt3);
            dd1->initWithString(text3.c_str(), "黑體", 22);
            pdd->addLabel(dd1);

            CCLabelTTF* dd2 = new CCLabelTTF();
            std::wstring tt4 = L"侵略2";
            std::string text4 = says->WStrToUTF8(tt4);
            dd2->initWithString(text4.c_str(), "黑體", 22);
            pdd->addLabel(dd2);

            pdd->setPosition(20,300);
            this->addChild(pdd,12);
            2013-07-17 19:42 | alsky

            # re: [cocos2d-x]分享一個(gè)簡(jiǎn)單的下拉列表控件。  回復(fù)  更多評(píng)論   

            多謝,不錯(cuò)的組件
            2013-10-11 08:19 | xjh

            # re: [cocos2d-x]分享一個(gè)簡(jiǎn)單的下拉列表控件。  回復(fù)  更多評(píng)論   

            謝謝分享。
            在研讀你的代碼!
            也謝謝樓上的測(cè)試代碼!
            謝謝分享!
            2014-09-17 16:47 | 簡(jiǎn)單
            久久人人爽人人爽人人片AV不| 狠狠精品干练久久久无码中文字幕 | 亚洲精品美女久久777777| 久久只有这精品99| 久久成人国产精品| 婷婷久久综合九色综合绿巨人| 中文字幕人妻色偷偷久久| 久久国产乱子伦免费精品| 久久精品99无色码中文字幕| 中文字幕无码av激情不卡久久| 欧美综合天天夜夜久久| 无码乱码观看精品久久| 精品熟女少妇a∨免费久久| 伊人久久一区二区三区无码| 成人国内精品久久久久影院VR | 精品久久久久香蕉网| 久久久WWW成人免费毛片| 97久久天天综合色天天综合色hd| 伊人久久五月天| 久久久久无码中| 好久久免费视频高清| 亚洲成色WWW久久网站| 久久亚洲av无码精品浪潮| 日韩精品久久久久久| 一本久久a久久精品亚洲| 亚洲精品成人久久久| 精品九九久久国内精品| 久久精品国产99国产精品导航 | 久久精品无码一区二区三区日韩| 久久r热这里有精品视频| 一本一道久久综合狠狠老| 久久影院亚洲一区| 色婷婷噜噜久久国产精品12p | 国产精品久久久香蕉| 国产69精品久久久久99| AAA级久久久精品无码片| 久久这里都是精品| 国产精品乱码久久久久久软件 | 亚洲国产精品狼友中文久久久| 久久久久国产精品嫩草影院| 色成年激情久久综合|