tah nn

主にアプリ開発の技術メモを残していきます。

【cocos2d-x】CCScrollViewでページスクロール

スクロールビューを使って、ページ切り替えをしたいときのメモです。
(環境:xcode5.1, cocos2d-x 2.2.2)

iPhone開発ではUIScrollViewにpagingEnabledというプロパティがあり、これをオンにするだけで実装可能ですが、cocos2d-xでは同じようなプロパティはないみたいです。

なのでCCScrollViewを少しいじってページ切り替えを出来るようにします。

まずヘッダーを編集します。以下の宣言を追加します。

/**
 * CCScrollView.h
 */
//...略
public:
    bool isPagingEnabled() { return _isPagingEnabled; }
    void setEnablePaging(bool isPagingEnabled) { _isPagingEnabled = isPagingEnabled; }
    void setPageSize(CCSize _pageSize){ pageSize = _pageSize; }
    CCSize getPageSize(){ return pageSize; }
protected:
    bool _isPagingEnabled;
    CCSize pageSize;
//略...

次にrelocateContatiner(bool animated)というメソッドに以下のように追記します。

/**
 * CCScrollView.cpp
 */
void CCScrollView::relocateContainer(bool animated)
{
//...略

    newX     = oldPoint.x;
    newY     = oldPoint.y;
    
    // ここから
    {
        if (_isPagingEnabled) {
            int horizontalPageNum = roundf(newX / pageSize.width);
            int verticalPageNum = roundf(newY / pageSize.height);
            
            if (m_eDirection == kCCScrollViewDirectionBoth || m_eDirection == kCCScrollViewDirectionHorizontal){
                newX = horizontalPageNum * pageSize.width;
            }
            
            if (m_eDirection == kCCScrollViewDirectionBoth || m_eDirection == kCCScrollViewDirectionVertical){
                newY = verticalPageNum * pageSize.height;
            }
        }
    }
    // ここまで追記
    
    if (m_eDirection == kCCScrollViewDirectionBoth || m_eDirection == kCCScrollViewDirectionHorizontal)
    {
        newX     = MAX(newX, min.x);
        newX     = MIN(newX, max.x);
    }
//略...
}

実際にスクロールビューを使うときには以下のようにして、ページ切替機能をオンにしてあげます。

    CCScrollView *scrollView = CCScrollView::create(CCSize(visibleSize.width, visibleSize.height));
    // スクロールビューをお好みで設定...
    scrollView->setEnablePaging(true);

以上です。

※参考
http://blackxxxwhite.blogspot.jp/2013/07/cocos2d-x-ccscrollview-semi-paging.html




  • 2014/8/9追記

cocos2d-x-3.x以降の場合は下記のようにします。

/**
 * CCScrollView.h
 */
//...略
public:
    bool isPagingEnabled() { return _isPagingEnabled; }
    void setEnablePaging(bool isPagingEnabled) { _isPagingEnabled = isPagingEnabled; }
    void setPageSize(Size _pageSize){ pageSize = _pageSize; }
    Size getPageSize(){ return pageSize; }
protected:
    bool _isPagingEnabled;
    Size pageSize;
//...略
/**
 * CCScrollView.cpp
 */
void CCScrollView::relocateContainer(bool animated)
{
    //...略

    newX     = oldPoint.x;
    newY     = oldPoint.y;

    // ここから
    {
        if (_isPagingEnabled) {
            int horizontalPageNum = roundf(newX / pageSize.width);
            int verticalPageNum = roundf(newY / pageSize.height);
            
            if (_direction == Direction::BOTH || _direction == Direction::HORIZONTAL){
                newX = horizontalPageNum * pageSize.width;
            }
            
            if (_direction == Direction::BOTH || _direction == Direction::VERTICAL){
                newY = verticalPageNum * pageSize.height;
            }
        }
    }
    // ここまで追記
    
    if (_direction == Direction::BOTH || _direction == Direction::HORIZONTAL)
    {
        newX     = MAX(newX, min.x);
        newX     = MIN(newX, max.x);
    }

    //略...
}