cocos 2dx--------Scrollview(七)

 Scrollview这玩意儿有两个类的实现,一种是cocos2d::extension::ScrollView,一种是cocos2d::ui::ScrollView。由于历史原因,用的是cocos2d::extension::ScrollView。所以需要继承ScrollViewDelegate。

目前这个代码是有一些问题的,可以确认是参数的问题。。但也是有了一些效果,做一些记录吧。

  1. 首先需要创建一个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__

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值