読者です 読者をやめる 読者になる 読者になる

Webエンジニアの備忘録

およそ自己の作業メモとして残しております。

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)
            {
            }