• <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, 評論 - 117, 引用 - 0
            數(shù)據(jù)加載中……

            [cocos2d-x]分享一個簡單的下拉列表控件。

            // 點擊,彈出,選擇,關(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 閱讀(5814) 評論(3)  編輯 收藏 引用 所屬分類: C++ 、游戲

            評論

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

            可以用,幫樓主寫了個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]分享一個簡單的下拉列表控件。  回復(fù)  更多評論   

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

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

            謝謝分享。
            在研讀你的代碼!
            也謝謝樓上的測試代碼!
            謝謝分享!
            2014-09-17 16:47 | 簡單
            久久99国产精品99久久| 久久综合九色欧美综合狠狠 | 伊人久久大香线蕉无码麻豆| 国产精品99久久99久久久| 人妻丰满?V无码久久不卡| 久久亚洲精品视频| 久久综合九色综合久99| 99久久国产综合精品成人影院| 亚洲国产二区三区久久| 99久久免费只有精品国产| 91精品婷婷国产综合久久| 久久99久久无码毛片一区二区| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 麻豆一区二区99久久久久| 精品久久人妻av中文字幕| 久久国产精品久久| 久久久艹| 少妇精品久久久一区二区三区| 久久亚洲精品无码AV红樱桃| 国产69精品久久久久777| 国产精品免费久久久久久久久| 麻豆久久| 国内精品九九久久久精品| 久久国产成人精品国产成人亚洲| 色婷婷久久久SWAG精品| 精品多毛少妇人妻AV免费久久 | 国产成人精品久久一区二区三区av| 曰曰摸天天摸人人看久久久| 久久久久国产精品三级网| 精品人妻伦九区久久AAA片69| 国产成人久久精品一区二区三区| 国产成人无码精品久久久久免费| 久久夜色精品国产噜噜亚洲a| 久久国产亚洲精品无码| 久久久受www免费人成| 久久综合给合久久国产免费| 久久久久国产精品麻豆AR影院 | 久久久久亚洲爆乳少妇无 | 色婷婷综合久久久久中文一区二区| 91精品日韩人妻无码久久不卡| 99久久国产综合精品女同图片|