#include "CCCGameScrollView.h"

USING_NS_CC;
USING_NS_CC_EXT; CCCGameScrollView::CCCGameScrollView()
:m_fAdjustSpeed(ADJUST_ANIM_VELOCITY)
, m_nPrePage(0)
{ } CCCGameScrollView::~CCCGameScrollView()
{ } bool CCCGameScrollView::init()
{
if (!CCScrollView::init())
{
return false;
} return true;
} bool CCCGameScrollView::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
{
m_BeginOffset = getContentOffset();
return CCScrollView::ccTouchBegan(pTouch, pEvent);
} void CCCGameScrollView::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )
{
CCScrollView::ccTouchMoved(pTouch, pEvent);
} void CCCGameScrollView::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )
{
CCPoint touchPoint = pTouch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint ); CCScrollView::ccTouchEnded(pTouch, pEvent); CCPoint m_EndOffset=getContentOffset(); if (m_BeginOffset.equals(m_EndOffset))
{
int nPage = abs(m_EndOffset.x / (int)m_CellSize.width);
m_pDelegate->scrollViewClick(nPage);
// pDele->scrollViewClick(m_EndOffset,touchPoint,m_pContainer->getChildByTag(nPage),nPage);
return ;
} adjustScrollView(m_BeginOffset,m_EndOffset);
} void CCCGameScrollView::ccTouchCancelled( CCTouch *pTouch, CCEvent *pEvent )
{
CCScrollView::ccTouchCancelled(pTouch, pEvent); CCPoint m_EndOffset=getContentOffset();
adjustScrollView(m_BeginOffset,m_EndOffset);
} void CCCGameScrollView::adjustScrollView( const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd)
{ int nPage = abs(oBegin.x / (int)m_CellSize.width); int nAdjustPage = 0; int nDis = oEnd.x-oBegin.x; if (nDis<-getViewSize().width/5)
{
nAdjustPage=nPage+1;
}
else if (nDis>getViewSize().width/5)
{
nAdjustPage=nPage-1;
}
else
{
nAdjustPage=nPage;
} nAdjustPage=MIN(nAdjustPage,m_nPageCount-1);
nAdjustPage=MAX(nAdjustPage,0); scrollToPage(nAdjustPage);
} void CCCGameScrollView::scrollToPage( int nPage )
{
// 关闭CCScrollView中的自调整
unscheduleAllSelectors(); CCPoint oOffset=getContentOffset();
// 调整位置
CCPoint adjustPos=ccp(-m_CellSize.width*nPage,0); // 调整动画时间
float adjustAnimDelay=ccpDistance(adjustPos,oOffset)/m_fAdjustSpeed; // 调整位置
setContentOffsetInDuration(adjustPos, adjustAnimDelay); if (nPage!=m_nPrePage)
{
schedule(schedule_selector(CCCGameScrollView::onScrollEnd),adjustAnimDelay,0,0.0f);
m_nPrePage=nPage;
}
} void CCCGameScrollView::onScrollEnd(float fDelay)
{
int nPage=getCurPage();
m_pDelegate->scrollViewScrollEnd(nPage);
} void CCCGameScrollView::scrollToNextPage()
{
int nCurPage=getCurPage();
if (nCurPage>=m_nPageCount-1)
{
return ;
}
scrollToPage(nCurPage+1);
} void CCCGameScrollView::scrollToPrePage()
{
int nCurPage=getCurPage();
if (nCurPage<=0)
{
return ;
}
scrollToPage(nCurPage-1);
} bool CCCGameScrollView::createContainer(CCCGameScrollViewDelegate* pDele,
int nCount, //总共的Page数量
const cocos2d::CCSize & oSize )//每一个Page的尺寸
{
m_nPageCount=nCount;
m_CellSize=oSize;
m_pDelegate = pDele;
CCLayer* pContainer=CCLayer::create();
pContainer->setAnchorPoint(CCPointZero);
pContainer->setPosition(CCPointZero); CCSize winSize=CCDirector::sharedDirector()->getVisibleSize(); for (int i=0;i<nCount;++i)
{
CCNode* pNode=CCNode::create();
pDele->scrollViewInitPage(pNode,i);
pNode->setPosition(ccp(winSize.width/2+i*oSize.width,winSize.height/2));
pNode->setTag(i);
pContainer->addChild(pNode);
} setContainer(pContainer);
setContentSize(CCSizeMake(oSize.width*nCount,oSize.height)); return true;
} int CCCGameScrollView::getCurPage()
{
return abs(getContentOffset().x / (int)m_CellSize.width);
}
#include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC;class CCCGameScrollViewDelegate: public cocos2d::extension::CCScrollViewDelegate{public: //初始化每个单独Page的回调 virtual bool scrollViewInitPage(cocos2d::CCNode* pPage,int nPage){return true;}; //点击一个Page的回调 virtual
void scrollViewClick(int nPage ){}; //每一次切换Page的回调 virtual void scrollViewScrollEnd(int nPage){};};

#include "cocos2d.h"
#include "cocos-ext.h"
#include "CCCGameScrollViewDelegate.h" // 校正滑动动画速度
#define ADJUST_ANIM_VELOCITY 2000 class CCCGameScrollView
: public cocos2d::extension::CCScrollView
{
private:
CCCGameScrollViewDelegate* m_pDelegate;
public:
CCCGameScrollView();
~CCCGameScrollView();
public:
CREATE_FUNC(CCCGameScrollView);
bool init(); bool createContainer(CCCGameScrollViewDelegate* pDele, int nCount,const cocos2d::CCSize & oSize ); virtual bool ccTouchBegan( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent ); virtual void ccTouchMoved( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent ); virtual void ccTouchEnded( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent ); virtual void ccTouchCancelled( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent ); void scrollToPage(int nPage);
void scrollToNextPage();
void scrollToPrePage(); int getCurPage();
protected:
void adjustScrollView(const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd); virtual void onScrollEnd(float fDelay);
protected:
int m_nPageCount;
int m_nPrePage;
cocos2d::CCPoint m_BeginOffset;
cocos2d::CCSize m_CellSize;
float m_fAdjustSpeed;
};

#include "cocos2d.h"
#include "cocos-ext.h"
#include "CCCGameScrollViewDelegate.h"
#include "CCCGameScrollView.h" USING_NS_CC;
USING_NS_CC_EXT; class PageViewLayer : public CCLayer, public CCCGameScrollViewDelegate
{
public:
CCCGameScrollView* m_ScrollView;
virtual bool init();
virtual void scrollViewDidScroll( cocos2d::extension::CCScrollView* view ) {}; virtual void scrollViewDidZoom( cocos2d::extension::CCScrollView* view ) {}; virtual bool scrollViewInitPage( cocos2d::CCNode* pPage,int nPage ); virtual void scrollViewClick(int nPage ); virtual void scrollViewScrollEnd(int nPage ); CREATE_FUNC(PageViewLayer);
};
#include "PageViewLayer.h"

bool PageViewLayer::init()
{
if (!CCLayer::init())
{
return false;
} CCSprite* pBackGround=CCSprite::create("btn_bar04.png");
pBackGround->setPosition(ccp(480,320));
addChild(pBackGround); // CCScrollView
m_ScrollView = CCCGameScrollView::create();
m_ScrollView->createContainer(
this,
4,//总共的Page数量
CCSizeMake(440,640));//每一个Page的尺寸
m_ScrollView->setPosition(ccp(240,0));
m_ScrollView->setContentOffset(CCPointZero);
m_ScrollView->setViewSize(CCSizeMake(400, 640));
m_ScrollView->setDirection(kCCScrollViewDirectionHorizontal); this->addChild(m_ScrollView); return true;
} bool PageViewLayer::scrollViewInitPage( cocos2d::CCNode* pPage,int nPage )
{
CCSprite *sprite = CCSprite::create("gezi.png");
sprite->setPosition(ccp(-300,0));
pPage->addChild(sprite);
return true;
} void PageViewLayer::scrollViewScrollEnd(int nPage )
{ } void PageViewLayer::scrollViewClick(int nPage )
{ }
												

coco2d-x CCScrollView实现背包翻页,仅供参考的更多相关文章

  1. Unity上一页下一页切换功能实现源码(仅供参考)

    在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: usin ...

  2. Ubuntu 12.04 分区方案(仅供参考)

    Ubuntu 12.04 分区方案(仅供参考)   总空间大小:50G 目录 建议大小 实际大小 格式 描述 / 10G~20G 10G ext4 根目录 swap <2048M 1G swap ...

  3. VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)

    自己开始接触vss 的时候有些小的习惯没有很好的养成,下面的有关VSS内容都是简单的迁入迁出的问题,(仅供参考) 1.文件的迁入迁出:(.txt..xlsx..doc) a:文件的覆盖问题: 对于文件 ...

  4. mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

    数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点.   请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https ...

  5. jdk1.8+SpringAOP注解报java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut select错误的不知原因的解决办法[仅供参考]

    先说办法:如果Aspectweaver-1.*.*jar这三个包版本比较低, 比如1.5.0这一层次的,可以找版本高一点的包替换低版本的包,问题可以得到解决 jar包的下载地址:https://mvn ...

  6. normalizr实践使用(个人总结,仅供参考)

    # normalizr实践使用 原数据 (自编数据,本数据仅供参考) var aaaObj ={ "id" : "0000000000000000000000000000 ...

  7. 第二步 (仅供参考) sencha touch 使用cmd打包apk

    最新版本的cmd可以直接将sencha touch项目打包成本地应用,不过还有很多不足,本文仅供参考 通过sencha app build native命令可以直接将项目打包成本地应用,不过在命令运行 ...

  8. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  9. 分享分享JavaScript100例-仅供参考

    最近一直在做项目,分享下以前收集的Javascript100例,仅供参考. http://files.cnblogs.com/52net/JavaScript100例.zip

随机推荐

  1. 碰撞回避算法(一) Velocity Obstacle

    碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...

  2. webdynpro tree控件使用

    1.  首先创建一个TREE控件 2.  在Tree下面创建一个TREE  NODE  TYPE ,node type 是可以继续展开的,而Item type是无法展开的. 3. 创建node.,下面 ...

  3. Vmware linux 安装 Vmware Tools 提示只读

    在Vmware 虚拟机里安装完linux ,安装Vmware Tools,的时候会提示只读问题,是因为在安装 Vmware Tools 使用的是光盘挂在,光盘为只读文件,所以没有办法再光盘上直接的解压 ...

  4. python httpConnection详解

    模块urllib,urllib2,httplib的区别 httplib实现了http和https的客户端协议,但是在python中,模块urllib和urllib2对httplib进行了更上层的封装. ...

  5. Uva - 11383 - Golden Tiger Claw

    题意:一个N*N的矩阵,第i行第j列的元素大小为w[i][j],每行求一个数row[i],每列求一个数col[j],使得row[i] + col[j] >= w[i][j],且所有的row[]与 ...

  6. pig对null的处理(实际,对空文本处理为两种取值null或‘’)

    pig对文本null的处理非常特殊.会处理成两种null,还会处理成''这样的空值. 比方,读name,age,sex日志信息.name取值处理,假设记录为".,,"这样,会将na ...

  7. 基于raw os 的事件触发系统

    Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...

  8. 复制文件时,如何显示进度条(使用BlockRead函数读取数据,并插入application.ProcessMessages)

    procedure mycopyfile(sourcef,targetf:string;i:integer); var FromF,ToF:file; NumRead,NumWritten:Integ ...

  9. 它们的定义Adapterg在etView( )正在使用View.setTag()与不同的是不使用。

    首先看使用Tag案件. @Override public View getView(int position, View view, ViewGroup group) { ViewHolder hol ...

  10. 一段代码让你秒懂java方法究竟是传值还是传地址

    先看看代码以及执行结果: 凝视写得非常清楚了.我就不多说了. 我说说我的结论.事实上在java中没有传值还是传址的概念,java仅仅有引用的概念.引用类似传址.只是是一个变量名中保存着对象的地址,地址 ...