Cocos2d-x 自定义实现下拉列表框(两种实现方法)

在引擎中并没有提供相应的下拉列表控件实现,所以如果在实际应用中需要的话就要自己代码实现。

  下面我介绍两种实现的方式,以供大家参考。


方法一:

这个方法我是参考了网上的一段代码,然后自己对代码进行部分的修改,下面贴出一个xcode中的下拉列表框样式:


下面先贴出自定义实现的效果图:


通常,一个下拉列表框都是这样的:

①有一个选中后的显示栏目;

②点击显示栏目后,显示下拉列表,选中的哪一个行会高亮显示;

③对下拉列表进行选择,选好后,下拉列表会消失,显示栏目显示选中的内容。


下面先贴出实现的代码:

#ifndef DropDownListBox_DROPDOWNLIST_h
#define DropDownListBox_DROPDOWNLIST_h

USING_NS_CC;

namespace CustomDropDownListBox
{
    //设置背景颜色
#define DROPDOWNLIST_NORMAL_COLOR       ccc4(128, 128, 128, 255)
#define DROPDOWNLIST_SELECTED_COLOR     ccc4(200, 200, 200, 255)
#define DROPDOWNLIST_HIGHLIGHT_COLOR    ccc4(0, 0, 255, 255)
    
#define DROPDOWNLIST_NORMAL_COLOR3       ccc3(128, 128, 128)
#define DROPDOWNLIST_SELECTED_COLOR3     ccc3(200, 200, 200)
#define DROPDOWNLIST_HIGHLIGHT_COLOR3    ccc3(0, 0, 255)
    
    class DropDownList : public CCLayer
    {
    public:
        //构造方法
        DropDownList(CCLabelTTF* label, CCSize size)
        : showLabel(label)
        , isShowMenu(false)
        , lastSelectedIndex(0)
        {
            //创建好一个menu,但是现在还不添加到视图中
            mainMenu = CCMenu::create();
            mainMenu->setPosition(CCPoint(size.width / 2, size.height / 2));
            mainMenu->retain();
            
            showLabel->setPosition(CCPoint(size.width / 2, size.height / 2));
            addChild(showLabel);
            
            setContentSize(size);
        }
        
        //析构函数
        ~DropDownList()
        {
            mainMenu->release();
        }
        
        //创建实例对象方法
        static DropDownList* create(CCLabelTTF* label, CCSize size)
        {
            DropDownList* list = new DropDownList(label, size);
            list->autorelease();
            return list;
        }
        //获取当前选中label的string
        std::string getString()
        {
            return showLabel->getString();
        }
        
        //获取当前选中的index
        int getSelectedIndex()
        {
            return lastSelectedIndex;
        }
        
        //设置选中index
        void setSelectedIndex(int index)
        {
            lastSelectedIndex = index;
            
            for (int i = 0, j = (int)selectLabels.size(); i < j; ++i)
            {
                if (i == lastSelectedIndex)
                {
                    bgLayers[i]->setColor(DROPDOWNLIST_HIGHLIGHT_COLOR3);
                    showLabel->setString(selectLabels[i]->getString());
                }
                else
                {
                    bgLayers[i]->setColor(DROPDOWNLIST_NORMAL_COLOR3);
                }
            }
        }
        
        void onEnter()
        {
            setTouchEnabled(true);
            CCLayer::onEnter();
        }
        
        void registerWithTouchDispatcher()
        {
            CCDirector* pDirector = CCDirector::sharedDirector();
            pDirector->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true);
        }
        
        virtual bool ccTouchBegan(CCTouch *touch, CCEvent *event)
        {
            if (!isShowMenu)
            {
                CCRect rect;
                rect.origin = CCPointZero;
                rect.size = getContentSize();
                CCPoint position = convertTouchToNodeSpace(touch
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cocos2d-x实现流光效果可以使用shader来进行渲染。首先,我们需要创建一个自定义的shader,并将其应用于需要实现流光效果的节点上。 在使用Cocos2d-x的过程中,我们可以使用GLSL语言编写shader代码。在实现流光效果的shader中,我们可以通过改变像素的颜色和透明度来创建流动的效果。 首先,我们定义一个uniform变量time,用于控制流光的移动速度。然后,在片段着色器中,通过改变颜色和透明度的计算公式来实现流动的效果。我们可以使用sin函数或者其他数学函数来计算出每个像素点的颜色和透明度,然后将其应用到节点上。 在节点的渲染流程中,我们将这个自定义的shader应用到节点上,然后传入时间参数,即更新uniform变量time的值。随着时间的增加,我们就可以看到节点上的流光效果在不断地移动。 为了实现更加逼真的流光效果,我们可以尝试给流光添加一些额外的效果,比如模糊、叠加等。通过调整shader代码中的计算公式和传入的参数,我们可以根据自己的需求来调整流光效果的强度和样式。 总结起来,在Cocos2d-x实现流光效果需要创建一个自定义的shader,并将其应用于需要实现效果的节点上。通过改变颜色和透明度的计算公式、传入时间参数等,我们可以实现一个流光效果,使节点看起来具有流动的动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值