• <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 | 簡單
            久久亚洲国产欧洲精品一| 性做久久久久久久久老女人| 伊人色综合久久天天人手人婷| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久人人爽人人爽人人爽| 久久99热这里只频精品6| 伊人久久大香线蕉亚洲| 2022年国产精品久久久久| 成人妇女免费播放久久久| 99久久免费国产精品| 性高朝久久久久久久久久| 中文字幕乱码久久午夜| 久久精品国产亚洲av麻豆小说| 久久久久免费精品国产| 无码人妻少妇久久中文字幕 | 亚洲国产精品久久久天堂| 国产亚洲精久久久久久无码| 伊人色综合久久天天| 中文字幕精品无码久久久久久3D日动漫 | 久久亚洲高清观看| 久久无码专区国产精品发布| 成人久久精品一区二区三区| 精品久久久久中文字| 思思久久好好热精品国产| 久久99热狠狠色精品一区| 美女久久久久久| 国产精品久久久久影院嫩草| 精品国产婷婷久久久| 久久无码人妻一区二区三区午夜| 国产精品99久久不卡| 久久无码人妻一区二区三区 | 午夜精品久久久久久影视riav| 91久久精一区二区三区大全| 一级做a爰片久久毛片看看| 伊人色综合久久天天| 久久亚洲春色中文字幕久久久| 久久久久久亚洲精品影院| 久久久久99精品成人片三人毛片| 久久青青草原国产精品免费| 日本欧美久久久久免费播放网| 亚洲日本va午夜中文字幕久久 |