cocos2dxでScrollViewを使う
ScrollViewについてはフレームワークを読む機会も多く、またソースも簡潔だったので備忘録がてら纏めておきます。
バージョン:cocos2d-x-3.3rc0(サンプルはC++)
パス:cocos2d_lib/extensions/GUI/CCScrollView/CCScrollView.cpp
#include "extensions/cocos-ext.h"
//画面サイズでスクロールビューを作る auto size = Director::getInstance()->getVisibleSize(); auto scrollView = ScrollView::create(size); auto layer = Hogehoge::create(); // 埋め込みたいレイヤー継承クラス scrollView->setContainer(layer); scrollView->setContentSize(layer->getContentSize()); scrollView->setDelegate(this);
初期位置の設定
// 初期のズームサイズ scrollView->setZoomScale(1.0f); // ビュー初期位置(以下はレイヤー中心の例) auto point = Point((size.width - battleField->getContentSize().width) / 2, (size.height - battleField->getContentSize().height) / 2) scrollView->setContentOffset(point);
ズームサイズ下限・上限
scrollView->setMinScale(0.5f); scrollView->setMaxScale(2.0f);
下限・上限については以下のようにフレームワーク上で制限されている。
cocos2d_lib/extensions/GUI/CCScrollView/CCScrollView.cpp(133行目あたり) //_minScale = _maxScale = 1.0f; _minScale = 0.5f; _maxScale = 2.0f;こちらの幅を超えては指定ができないので、事前に書き換えておく必要がある。
バウンスを許可するか(以下は非許可)
scrollView->setBounceable(false);
移動方向制限
scrollView->setDirection(cocos2d::extension::ScrollView::Direction::BOTH);
BOTH/VERTICAL/HORIZONTAL/NONEと指定ができる
特定のゲームイベント時にスクロールを止めたいなどのときはNONEを利用する。ただしそのままだと効かないので(バグ?)、onTouchMovedメソッドの修正が必要
cocos2d_lib/extensions/GUI/CCScrollView/CCScrollView.cpp(718行目あたり) // 以下を追加 else if (_direction == Direction::NONE) { }