【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); } //略... }