Scrollview这玩意儿有两个类的实现,一种是cocos2d::extension::ScrollView,一种是cocos2d::ui::ScrollView。由于历史原因,用的是cocos2d::extension::ScrollView。所以需要继承ScrollViewDelegate。
目前这个代码是有一些问题的,可以确认是参数的问题。。但也是有了一些效果,做一些记录吧。
- 首先需要创建一个layer,这是一个容器层,之后的所有东西都是基于这个容器层之上展开的。(之后称这个层为白色底板)
auto scroll_layer = Layer::create();//创建scrollView中的容器层
scroll_layer->setAnchorPoint(Point::ZERO);
scroll_layer->setPosition(Point::ZERO);
scroll_layer->setContentSize(Size(960, 800));//设置容器层大小为(600,300)
2.创建一个sprite,把他放入容器里面。注意:图片位置的设置是以容器为参考系而设置的坐标。比如此例就是在白色底板上,设置sprite的位置在白纸上的(150,110)。
auto boy = Sprite::create("HelloWorld.png");
boy->setAnchorPoint(Point::ZERO);
boy->setPosition(Point(150.0f,100.0f));
scroll_layer->addChild(boy);
3.创建一个滑窗scrollview组件,这个组件,据我调试的感觉看来,他就像是600*300白色底板上的大小为400*600的可视窗口。而这个可视窗口的起始位置则是setContentOffsetl来确认的。
auto scrollView = ScrollView::create(Size(400,600),scroll_layer);//创建scrollView,显示窗口大小为(400,300)
scrollView->setDelegate(this);
scrollView->setDirection(ScrollView::Direction::HORIZONTAL);//设置滚动方向为竖直 HORIZONTAL VERTICAL
scrollView->setAnchorPoint(Point::ZERO);
scrollView->setPosition(Point(0,0));
scrollview->setContentOffset(size(0,-200),1); //设置Scrollview起点位置
this->addChild(scrollView);
4.当设置滑动方向为竖直方向,则在上下拖动的时候(如果朝上拖不动,可能的原因是:1.scrollview窗口到达了白色底板边界 2.scrollview窗口太大,容器太小,拖不动----暂时想到的就这些,总之比较头疼的就是把这scrollview的起始位置,大小,容器大小,背景图片位置这几个坐标配合使用达到目的)。则会进入void HelloWorld::scrollViewDidScroll(ScrollView* view)回调函数,通过在这里面设置sprite的坐标来实现视觉上的滑动效果。
5.小结:所谓scrollview就是一个可视的窗口,通过手指在屏幕滑动,从而设置白色底板上的sprite的位置,从而实现拖动的效果。。
#include "HelloWorldScene.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
return HelloWorld::create();
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !Scene::init() )
{
return false;
}
auto scroll_layer = Layer::create();//创建scrollView中的容器层
scroll_layer->setAnchorPoint(Point::ZERO);
scroll_layer->setPosition(Point::ZERO);
scroll_layer->setContentSize(Size(960, 800));//设置容器层大小为(600,300)
auto scrollView = ScrollView::create(Size(400,600),scroll_layer);//创建scrollView,显示窗口大小为(400,300)
scrollView->setDelegate(this);
scrollView->setDirection(ScrollView::Direction::HORIZONTAL);//设置滚动方向为竖直 HORIZONTAL VERTICAL
scrollView->setAnchorPoint(Point::ZERO);
scrollView->setPosition(Point(0,0));
scrollview->setContentOffset(size(0,-200),1); //设置Scrollview起点位置
this->addChild(scrollView);
auto boy = Sprite::create("HelloWorld.png");
boy->setAnchorPoint(Point::ZERO);
boy->setPosition(Point(150.0f,100.0f));
scroll_layer->addChild(boy);
sp_vec.pushBack(boy);//将三个对象放入容器中
return true;
}
void HelloWorld::scrollViewDidScroll(ScrollView* view)
{
//printf("hello\n");
//在scrollView拖动时响应该函数
auto offsetPosX = (view->getContentOffset()).x + 150.0f;
auto offsetPosy = (view->getContentOffset()).y + 100.0f;
//sp_vec.at(0)->setPosition(Point( 0, 0 ));
printf("x==== %f\n",offsetPosX);
printf("y==== %f\n",offsetPosy);
// printf("y==== %f\n",offsetPosy);
if( view->isDragging())
{
//CCLOG("ScrollView移动");
}
}
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "../extensions/cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
// class HelloWorld : public cocos2d::Scene
// {
// public:
// static cocos2d::Scene* createScene();
// virtual bool init();
// // implement the "static create()" method manually
// CREATE_FUNC(HelloWorld);
// };
class HelloWorld : public cocos2d::Scene,public ScrollViewDelegate
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);
//scroll 委托
void scrollViewDidScroll(ScrollView* view);
//void scrollViewDidZoom(ScrollView* view);
// void scrollViewMoveOver(ScrollView* view);
private:
Vector<Sprite*> sp_vec;//声明一个容器
};
#endif // __HELLOWORLD_SCENE_H__