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

cocos2d-x 3.0系でのScrollViewとTouch処理のメモ

自メモ)


http://twitter.com/k_yokomi/status/453818022495416320:twitter:detail:right

http://twitter.com/k_yokomi/status/453839459998371840:twitter:detail:right




ScrollViewに関して)

だけだとAnd版では参照エラーが出る

  • HelloWorld.cpp等
#include "extensions/cocos-ext.h"
USING_NS_CC_EXT;

に加えて

$(call import-module,2d)
$(call import-module,extensions)//追加
$(call import-module,audio/android)

の追記が必要 *1

ちなみに

の話のEventListenerTouchAllAtOnce(マルチタッチ)とScrollViewを合わせるとうまく動かない

そもそも EventListenerTouchOneByOne でもマルチタッチとれるしな。。




ScrollViewのoveride>

  • MyScrollView.h
#ifndef __MY_SCROLL_VIEW_H__
#define __MY_SCROLL_VIEW_H__

//ScrollView用
#include "extensions/cocos-ext.h"
minScale/maxScale の追加

NS_CC_EXT_BEGIN;

class MyScrollView: public ScrollView {
public:
    static MyScrollView* create(Size size, Node* container = NULL);
    static MyScrollView* create();
    MyScrollView();
    virtual ~MyScrollView();

   void minScale(float value);
   void maxScale(float value);
};

NS_CC_EXT_END
#endif /* __MY_SCROLL_VIEW_H__ */
  • MyScrollView.cpp
#include "MyScrollView.h"
#include "extensions/ExtensionMacros.h"

NS_CC_EXT_BEGIN

//see http://slashdot.jp/journal/311876/%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D%EF%BC%9AC%2B%2B%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%B3%A8%E6%84%8F%E7%82%B9
MyScrollView::MyScrollView()
:ScrollView()
{
}

MyScrollView::~MyScrollView()
{

}

MyScrollView* MyScrollView::create(Size size, Node* container/* = NULL*/)
{
    MyScrollView* pRet = new MyScrollView();
    if (pRet && pRet->initWithViewSize(size, container))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}

MyScrollView* MyScrollView::create()
{
    MyScrollView* pRet = new MyScrollView();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}

void MyScrollView::minScale(float value){
	_minScale = value;
}


void MyScrollView::maxScale(float value){
	_maxScale = value;
}
NS_CC_EXT_END



実際の使う箇所の初期化例)
☆に関してはなんか納得がいかない対応orz

MyScrollView* pScrollView = nullptr; 

bool ViewController::init() {
	//〜略〜

	//画面サイズでスクロールビューを作る
	pScrollView = MyScrollView::create(
			Size(visibleSize.width, visibleSize.height - 200)//☆Menuを上部に入れる場合スクロールエリアを減らす(左下が0,0なので)
	);

	pScrollView->setPosition(
			ccp(-16,-16)  //☆なんか左下に埋もれるので補正が必要っぽい
			//Point::ZERO
	);
	//pScrollView->setPosition(Point::ZERO);
	pScrollView->setBounceable(true);//ぴょんと動くか否か
	pScrollView->minScale(1.0f);
	pScrollView->maxScale(3.0f);
	this->addChild(pScrollView);

	//パネルの登録
	init_panel();

	//〜略〜
}

void ViewController::init_panel(){
	auto game_view = GameViewController::create();
	Size size = game_view->getContentSize();
	CCLOG(">>>> ViewController::init_panel <pre>(%f,%f)",size.width,size.height);
	pScrollView->setContainer(game_view);
	pScrollView->setContentSize(size);

	Size chk_size = pScrollView->getContentSize();
	CCLOG(">>>> ViewController::init_panel <aft>(%f,%f)",chk_size.width,chk_size.height);
}

*1:Android.mkがあればそのフォルダは import-module対象