zoukankan      html  css  js  c++  java
  • Cocos2d-x3.0下实现循环列表

    本文的实现是參照我之前在做iOS时实现的一个能够循环的列表这里用C++重写一遍。

    效果:



    原文地址:http://blog.csdn.net/qqmcy/article/details/27393011

    用法:能够使用创建project时的HelloWorld測试

    ,h文件里加入循环列表的监听回调

     void djInfiniteScroll(Ref* sender);
        


    .cpp

    #include "DJInfiniteScrollPicker.h"
    

            DJInfiniteScrollPicker* picker = DJInfiniteScrollPicker::create();
            picker->setSize(Size(500, 500));
            picker->imageAry = set1;
            picker->setPosition(Point(10, 100));
            picker->setBackGroundColorType(cocos2d::ui::LAYOUT_COLOR_SOLID);
            picker->setBackGroundColor(Color3B(128, 128, 128));
            picker->initInfiniteScrollView();
            
            addChild(picker);
            
            picker->addEventDJInifiteScrollPicker(this, djInfinitescrollvieweventselector(TestScene::djInfiniteScroll));

    实现类:

    DJInfiniteScrollPicker.h

    //
    //  DJInfiniteScrollPicker.h
    //  maptest
    //
    //  Created by 杜甲 on 14-5-27.
    //
    //
    
    #ifndef __maptest__DJInfiniteScrollPicker__
    #define __maptest__DJInfiniteScrollPicker__
    
    #include "cocos2d.h"
    #include "ui/CocosGUI.h"
    #include "extensions/cocos-ext.h"
    
    USING_NS_CC;
    typedef enum
    {
        sc = 0,
        sc1
    }ScType;
    
    typedef void (Ref::*SEL_InfiniteScrollViewEvent)(Ref*);
    
    #define djInfinitescrollvieweventselector(_SELECTOR) (SEL_InfiniteScrollViewEvent)(&_SELECTOR)
    
    
    class DJInfiniteScrollPicker:public  ui::Layout,public extension::ScrollViewDelegate
    {
        
    public:
        CREATE_FUNC(DJInfiniteScrollPicker);
        virtual bool init();
        
        static DJInfiniteScrollPicker* create(Size wsize);
        virtual bool initWithSize(Size wsize);
        
    
    
        virtual void scrollViewDidScroll(extension::ScrollView* view);
        /**
         * @js NA
         * @lua NA
         */
        virtual void scrollViewDidZoom(extension::ScrollView* view);
        
        void initInfiniteScrollView();
        
    
        extension::ScrollView* infiniteScrollView;
        
        std::vector<std::string> imageAry;
        Size itemSize;
        float alphaOfobjs;
        
        float heightOffset;
        float positionRatio;
        
        void addEventDJInifiteScrollPicker(Ref* sender,SEL_InfiniteScrollViewEvent type);
        
        
        
        
    private:
        std::vector<Sprite*> imageStore;
        
    
        float beforePointX;
        std::string fontName;
        void reloadView(float offset);
        void snapToAnEmotion();
        
        Sprite* currSprite;
        bool isFirstDrag;
        int currNum;
        
        Ref* _infiniteEventListener;
        SEL_InfiniteScrollViewEvent _infiniteEventSelector;
        
        
        
    
    };
    
    #endif /* defined(__maptest__DJInfiniteScrollPicker__) */
    

    DJInfiniteScrollPicker.cpp

    //
    //  DJInfiniteScrollPicker.cpp
    //  maptest
    //
    //  Created by 杜甲 on 14-5-27.
    //
    //
    
    #include "DJInfiniteScrollPicker.h"
    bool DJInfiniteScrollPicker::init()
    {
        bool bRet = false;
    
        do {
            CC_BREAK_IF(!ui::Layout::init());
            
            bRet = true;
        } while (0);
        return bRet;
    }
    
    DJInfiniteScrollPicker* DJInfiniteScrollPicker::create(Size size)
    {
        DJInfiniteScrollPicker* pRet = new DJInfiniteScrollPicker();
        if (pRet && pRet->initWithSize(size))
        {
            pRet->autorelease();
        }
        else
        {
            CC_SAFE_DELETE(pRet);
        }
        return pRet;
    
    }
    
    bool DJInfiniteScrollPicker::initWithSize(cocos2d::Size size)
    {
        bool bRet = false;
        do {
            CC_BREAK_IF(!ui::Layout::init());
            
            
          
            
            
            
            bRet = true;
        } while (0);
        return bRet;
    }
    
    
    
    
    void DJInfiniteScrollPicker::initInfiniteScrollView()
    {
        isFirstDrag = false;
        fontName = "TrebuchetMS-Bold";
        
        
        alphaOfobjs = 1.0f;
        heightOffset = 0.0f;
        positionRatio = 1.0f;
        
        beforePointX = 0.0f;
        
        infiniteScrollView = extension::ScrollView::create(getSize());
        infiniteScrollView->retain();
        infiniteScrollView->setPosition(Point(0, 0));
        
        
        infiniteScrollView->setBounceable(false);
        infiniteScrollView->setDelegate(this);
        //infiniteScrollView->setContentSize(get);
        addChild(infiniteScrollView);
        
       Sprite* temp = Sprite::create("res/set2/s2_1.png");
    //    log("anchor = %f",temp->getAnchorPoint().x);
    //    temp->setPosition(Point(temp->getContentSize().width / 2, temp->getContentSize().height / 2));
    //    // temp->setPosition(Point( itemSize.width, 0));
    //    infiniteScrollView->addChild(temp);
        
        
        if (imageAry.size() > 0) {
            
            itemSize  = temp->getContentSize();
        }
        
        
        
    //    
        if (imageAry.size() > 0) {
            for (int i = 0; i < (imageAry.size() * 5); i++) {
                //ui::Text* temp = ui::Text::create(StringUtils::format("%d",i % (int)imageAry.size()), fontName, 23);
                Sprite* sprite = Sprite::create(imageAry.at(i % imageAry.size()));
                sprite->setTag(i % imageAry.size());
                sprite->setPosition(Point(i * itemSize.width + itemSize.width / 2, itemSize.height / 2));
                imageStore.push_back(sprite);
                infiniteScrollView->addChild(sprite);
            }
        }
       
    
        
        infiniteScrollView->setContentSize(Size(imageAry.size() * 5 * itemSize.width, getSize().height));
        float viewMiddle = imageAry.size() * 2 * itemSize.width;
        
        infiniteScrollView->setContentOffset(Point(-viewMiddle , 0));
        
        
    }
    
    void DJInfiniteScrollPicker::scrollViewDidScroll(extension::ScrollView *view)
    {
        float sectionSize = imageAry.size() * itemSize.width;
        log("QQQQQQQQQQQQ%f,%f",infiniteScrollView->getContentOffset().x,beforePointX);
        
        
        
        if (beforePointX != infiniteScrollView->getContentOffset().x)
        {
            
            if (infiniteScrollView->getContentOffset().x < 0)
            {
                if (infiniteScrollView->getContentOffset().x >= (-sectionSize + sectionSize / 2))
                {
                    view->setContentOffset(Point(-sectionSize * 2 +sectionSize / 2, 0));
                }
                else if (view->getContentOffset().x <= (-sectionSize * 3 - sectionSize / 2))
                {
                    view->setContentOffset(Point(-sectionSize * 2 - sectionSize / 2, 0));
                }
               // if (infiniteScrollView->isDragging()) {
                   // log("拖拽中");
                     reloadView(view->getContentOffset().x - getSize().width / 2);
             //   }
                
                
            }
            else
            {
                view->setContentOffset(Point(-sectionSize * 2 + sectionSize / 2, 0));
            }
            
            
            //推断是否被拖拽
            if (!infiniteScrollView->isDragging()) {
                
                //推断是否是首次进入,首次不拖拽
                if (isFirstDrag) {
                    beforePointX = -currSprite->getPosition().x + getSize().width / 2;
                    view->setContentOffset(Point(beforePointX, 0));
                      //log("停止拖拽view->getContentOffset().xQQ = %f",view->getContentOffset().x);
                    if (_infiniteEventListener && _infiniteEventSelector) {
                        (_infiniteEventListener->*_infiniteEventSelector)(currSprite);
                        
                        
                    }
                    
    //                if (_scrollViewEventListener && _scrollViewEventSelector)
    //                {
    //                    (_scrollViewEventListener->*_scrollViewEventSelector)(this, SCROLLVIEW_EVENT_SCROLL_TO_TOP);
    //                }
                    
                }
                
                
                isFirstDrag = true;
            }
    
    
        }
        log("view->getContentOffset().x = %f",view->getContentOffset().x);
        
        beforePointX = view->getContentOffset().x;
        
        
       
       
        
    }
    
    void DJInfiniteScrollPicker::reloadView(float offset)
    {
       
        float biggestSize = 0.0f;
        Ref* biggestView;
        Sprite* sprite = imageStore.at(2);
        
        
        
        for (int i = 0; i < imageStore.size(); i++)
        {
            Sprite* sprite = imageStore.at(i);
            
            
    
            if (-sprite->getPosition().x > (offset - itemSize.width / 2) && -sprite->getPosition().x < (offset + itemSize.width / 2)) {
    
                
                currSprite = sprite;
                currNum = i;
                
                
                sprite->setScale(2);
                
            }else
            {
                sprite->setScale(1);
            }
        }
    }
    
    
    
    void DJInfiniteScrollPicker::snapToAnEmotion()
    {
        
        float offset = infiniteScrollView->getContentOffset().x - getSize().width / 2;
        
        
        
    }
    
    
    void DJInfiniteScrollPicker::scrollViewDidZoom(extension::ScrollView *view)
    {
        
    }
    
    void DJInfiniteScrollPicker::addEventDJInifiteScrollPicker(cocos2d::Ref *sender, SEL_InfiniteScrollViewEvent type)
    {
        _infiniteEventListener = sender;
        _infiniteEventSelector = type;
    }
    
    














  • 相关阅读:
    SQL Server 2005 Beta 2 快照隔离 zt
    WP7基础学习第九讲
    WP7基础学习第七讲
    WP7基础学习第二讲
    如何对HttpWebRequest异步调用?
    WP7基础学习第五讲
    如何对HttpWebRequest和HttpWebRsponse异步调用?
    WP7基础学习第六讲
    WP7基础学习第一讲
    [收藏学习]gcc和g++
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3764609.html
Copyright © 2011-2022 走看看