MyScrollItem是CCScrollView容器内项的接口,MyScrollView主要处理添加子节点和事件的处理,MyScrollViewTestItem是对MyScrollItem实现的测试项,MyScrollViewTest测试类

/*MyScrollView.h*/
#ifndef _MY_SCROLL_VIEW_
#define _MY_SCROLL_VIEW_
#include "cocos2d.h"
#include "CCScrollView.h"
#include "ExtensionMacros.h"
using namespace cocos2d;
USING_NS_CC_EXT;
class MyScrollItem : public CCNode
{
public:
bool isSelected(CCTouch* pTouch);
void touched();
virtual bool init(CCSize size);
virtual void selected()=;
};
class MyScrollView : public CCLayer,public CCScrollViewDelegate
{
private:
CCScrollView* m_pScrollView;
CCNode* m_pContainer;
CCSize m_itemSize;
bool m_isScrolling;
public:
MyScrollView();
static MyScrollView* create(CCPoint pos,CCSize viewSize,CCScrollViewDirection dir);
bool init(CCPoint pos,CCSize viewSize,CCScrollViewDirection dir);
void addItem(MyScrollItem* item);
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent);
virtual void ccTouchMoved(CCTouch* pTouch,CCEvent* pEvent);
virtual void ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent);
virtual void scrollViewDidScroll(CCScrollView* view);
virtual void scrollViewDidZoom(CCScrollView* view);
virtual void draw();
};
#endif /*MyScrollView.cpp*/ #include "cocos2d.h"
#include "CCScrollView.h"
#include "MyScrollView.h"
#include <stdio.h>
using namespace cocos2d;
using namespace cocos2d::extension; bool MyScrollItem::isSelected(CCTouch* pTouch)
{
CCPoint touch = this->convertTouchToNodeSpace(pTouch);
CCSize size = this->boundingBox().size; // boundingBox()返回的是当前节点经过缩放旋转后在本地坐标的矩形
return CCRect(,,size.width,size.height).containsPoint(touch);
}
bool MyScrollItem::init(CCSize size)
{
if(!CCNode::init()) return false;
this->setContentSize(size);
return true;
}
void MyScrollItem::touched()
{
this->stopAllActions();
CCScaleTo* scaleTo1 = CCScaleTo::create(0.1f,0.9f);
CCScaleTo* scaleTo2 = CCScaleTo::create(0.1f,1.0f);
this->runAction(CCSequence::create(scaleTo1,scaleTo2,NULL));
} MyScrollView::MyScrollView(){}
MyScrollView* MyScrollView::create(CCPoint pos,CCSize viewSize,CCScrollViewDirection dir)
{
MyScrollView* scrollview = new MyScrollView();
if(scrollview && scrollview->init(pos,viewSize,dir))
{
scrollview->autorelease();
return scrollview;
}
return NULL;
} bool MyScrollView::init(CCPoint pos,CCSize viewSize,CCScrollViewDirection dir)
{
if(!CCLayer::init()) return false;
m_pScrollView = CCScrollView::create(viewSize);
m_pContainer = CCNode::create();
m_pScrollView->setBounceable(false);//设置弹性效果
m_pScrollView->setContainer(m_pContainer);//设置容器
m_pScrollView->setTouchPriority(-);//设置优先级
m_pScrollView->setTouchEnabled(true);//设置可触摸
m_pScrollView->setDirection(dir); //设置方向
m_pScrollView->setDelegate(this); //设置代理 m_pScrollView->setPosition(ccp(,)); /*CCLayerColor* layer = CCLayerColor::create(ccc4(255,0,0,255),viewSize.width,viewSize.height);
layer->setPosition(pos);
this->addChild(layer,1,100);*/ this->addChild(m_pScrollView);
this->setTouchEnabled(true);
this->setPosition(pos);
return true;
}
void MyScrollView::registerWithTouchDispatcher()
{
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,,true);
}
void MyScrollView::addItem(MyScrollItem* item)
{
CCPoint pos;
int count = m_pContainer->getChildrenCount();
item->ignoreAnchorPointForPosition(false);
item->setAnchorPoint(ccp(0.5f,0.5f));
if(count)
{
CCNode* endItem = m_pContainer->getChildByTag(count-);
pos = ccp(endItem->getPositionX()+m_itemSize.width,endItem->getPositionY());
}
else
{
if(m_itemSize.width== || m_itemSize.height==) m_itemSize = item->getContentSize();
pos = ccp(m_itemSize.width/,m_itemSize.height/);
}
item->setPosition(pos);
m_pContainer->setContentSize(CCSizeMake(m_itemSize.width*(count+),m_itemSize.height));
m_pContainer->addChild(item,,count);
}
bool MyScrollView::ccTouchBegan(CCTouch* pTouch,CCEvent* pEvent)
{
m_isScrolling = false;
if(m_pContainer->getChildrenCount())
{
CCPoint touch = m_pContainer->convertTouchToNodeSpace(pTouch);
MyScrollItem* item = (MyScrollItem*)m_pContainer->getChildByTag(touch.x/m_itemSize.width);
if(item && item->isSelected(pTouch))
{
item->touched();
return true;
}
}
return false;
}
void MyScrollView::ccTouchMoved(CCTouch* pTouch,CCEvent* pEvent)
{
m_isScrolling = true;
}
void MyScrollView::ccTouchEnded(CCTouch* pTouch,CCEvent* pEvent)
{
if(!m_isScrolling)
{
CCPoint touch = m_pContainer->convertTouchToNodeSpace(pTouch);
MyScrollItem* item = (MyScrollItem*)m_pContainer->getChildByTag(touch.x/m_itemSize.width);
item->selected();
}
}
void MyScrollView::scrollViewDidScroll(CCScrollView* view)
{
char str[];
sprintf(str,"pos=(%d,%d)\n",m_pContainer->getPositionX(),m_pContainer->getPositionY());
OutputDebugString(str);
}
void MyScrollView::scrollViewDidZoom(CCScrollView* view)
{
}
void MyScrollView::draw()
{
CCLayer::draw();
//int count = m_pContainer->getChildrenCount();
//m_pContainer->setPosition(ccp(0,0));
}
/*ScrollViewTest.h*/
#ifndef _SCROLLVIEW_TEST_
#define _SCROLLVIEW_TEST_
#include "cocos2d.h"
USING_NS_CC;
#include"MyScrollView.h"
class MyScrollViewTestItem : public MyScrollItem
{
public:
static MyScrollViewTestItem* create(CCSize size);
virtual bool init(CCSize size);
virtual void selected();
};
class MyScrollViewTest : public CCLayer
{
public:
CREATE_FUNC(MyScrollViewTest);
bool init();
};
#endif
/*ScrollViewTest.cpp*/
#include "cocos2d.h"
#include "ScrollViewTest.h"
#include "MyScrollView.h"
#include <iostream>
using namespace std;
MyScrollViewTestItem* MyScrollViewTestItem::create(CCSize size)
{
MyScrollViewTestItem* item = new MyScrollViewTestItem();
if(item && item->init(size))
{
item->autorelease();
return item;
}
CC_SAFE_DELETE(item);
return NULL;
}
bool MyScrollViewTestItem::init(CCSize size)
{
if(!MyScrollItem::init(size)) return false;
CCSprite* sprite = CCSprite::create("1.png");
sprite->setPosition(ccp(size.width/,size.height/));
this->addChild(sprite);
return true;
}
void MyScrollViewTestItem::selected()
{
char str[];
sprintf(str,"selected tag = %d\n",this->getTag());
OutputDebugString(str);
}
bool MyScrollViewTest::init()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSize viewSize = CCSizeMake(,);
CCPoint pos = ccp(,);
CCSize itemSize = CCSizeMake(,);
MyScrollView* myScroll = MyScrollView::create(ccp(,),viewSize,kCCScrollViewDirectionHorizontal);
for(int i=;i<;i++)
{
MyScrollViewTestItem* item = MyScrollViewTestItem::create(itemSize);
myScroll->addItem(item);
}
this->addChild(myScroll);
this->setPosition(pos);
return true;
}
/*添加几个cocos2dx函数源码*/
void CCScrollView::addChild(CCNode * child, int zOrder, int tag)
{
child->ignoreAnchorPointForPosition(false);
child->setAnchorPoint(ccp(0.0f, 0.0f));
if (m_pContainer != child) {
m_pContainer->addChild(child, zOrder, tag);
} else {
CCLayer::addChild(child, zOrder, tag);
}
}
由此可以看出CCScrollView中只有m_pContainer一个子节点,向CCScrollView中添加节点也就是向m_pContainer节点。
void CCScrollView::setContentSize(const CCSize & size)
{
if (this->getContainer() != NULL)
{
this->getContainer()->setContentSize(size);
this->updateInset();
}
}
由此看出CCScrollView设置内容大小其实就是设置容器大小
void CCScrollView::setContainer(CCNode * pContainer)
{
this->removeAllChildrenWithCleanup(true);
if (!pContainer) return;
this->m_pContainer = pContainer;
this->m_pContainer->ignoreAnchorPointForPosition(false);
this->m_pContainer->setAnchorPoint(ccp(0.0f, 0.0f));
this->addChild(this->m_pContainer);
this->setViewSize(this->m_tViewSize);
}
由此看出CCScrollView添加容器时删除了自己的其他所有子节点
void CCScrollView::setViewSize(CCSize size)
{
m_tViewSize = size;
CCLayer::setContentSize(size);
}
setViewSize才是设置CCScrollView本身的大小

CCScrollView练习的更多相关文章

  1. 【Cocos2d-x for WP8 学习整理】(3)CCScrollView 实现捕鱼达人一样的场景选择界面

    UI 界面一般是游戏里比较独立的地方,因为游戏引擎一般都比较注意基础的功能封装,很少会关注UI,但是 UI 确是玩家第一眼看到的效果,因此能否实现一个美观的UI对于提升游戏的整体美观有着很大的帮助. ...

  2. cocos2d-x CCScrollView和CCTableView的使用(转载)

    转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/cocos2d-x/1024.html //============================== ...

  3. cocos2dx 2.0 CCScrollView的用法以及滑动的原理

    #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_N ...

  4. [cocos2dx]让CCScrollView支持分页

    [cocos2dx]让CCScrollView支持分页 做过IOS开发的朋友, 肯定知道UIScrollView有一个isPaged属性. 当设置其为true的时候, 滑动会自动分页. 即, 每次滑动 ...

  5. CCScrollView/CCTableView(CCTableViewDelegate CCTableViewDataSource CCTableView-滑动列表-游戏中大量使用 非常重要的一个类)

    tableview scrollViewDidScroll函数中有一段   ----  即---滑动tableview时触发的函数 : 会将全部显示的cell又一次刷新(刷新函数中调用了自己定义的ta ...

  6. CCScrollView 实现帮助界面、关卡选择

    本文出自[无间落叶]:http://blog.leafsoar.com/archives/2013/07-27.html 本文介绍了 CCScrollView 来编写帮助界面和关卡选择界面的方法,在编 ...

  7. cocos2d-x CCScrollView

    转自:http://www.cnblogs.com/dcxing/archive/2012/12/31/2840217.html ScrollView一般用在游戏的关卡选择这种类似的场景还有帮助这种场 ...

  8. Cocos2d-x滚动列表具体解释(CCScrollView的使用)

    今天要写一个滚动列表功能,类似以下这样.(图片资源都是自己从天天酷跑里面抠的,仅用于学习方便) 首先,这样一个列表就和iOS里面的UITableView没什么两样,当然,Android中肯定也存在类似 ...

  9. Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)

    CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...

  10. cocos2d-x中的CCScrollView滑动体验不佳

    在最近的项目中,使用了Cocos2d-x (2.2.0版本)提供的CCScrollView来拖动一个比较大的画面,但是发现滑动体验非常不佳, 手指离开屏幕后,滑动没有惯性,一个不算太大的画面,要滑动好 ...

随机推荐

  1. Sublime + python2.7 + opencv (轻量级开发环境)

    工具: 1. Python2.7,安装完成 2. 相应版本的cv2.pyd,放入到…\Python27\Lib\site-packages\下 3. 下载Sublime Text 3,破解它,网上搜个 ...

  2. Unit07: MyBatis框架简介 、 MyBatis基本应用

    Unit07: MyBatis框架简介 . MyBatis基本应用 1. myBatis (1)myBatis是什么? 是一个开源的持久层框架. 注:myBatis底层仍然是jdbc. (2)编程步骤 ...

  3. Jetty实战(杂七杂八)

    最近开始选择JETTY作为服务器了,乘这现在空闲点学习了些JETTY的部署知识,原来她真的跟TOMCAT很类似,先总结如下: 部署应用方法(下载好jetty); 方法一: 直接将应用的 war包放在j ...

  4. Core Java (十一) Java 继承,类,超类和子类

    Core Java (十一) Java 继承,类,超类和子类 标签: javaJavaJAVA 2013-01-22 17:08 1274人阅读 评论(0) 收藏 举报  分类: java(58) 读 ...

  5. 函数和object

    普通函数 在javascript中,函数是一等公民,函数在javascript是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用. 一.函数调用形式 函数调用形式是最常见的形式,也是 ...

  6. 脱壳系列(一) - CrypKeySDK 壳

    程序: 运行 用 PEiD 载入程序 PEid 显示找不到相关的壳 脱壳: 用 OD 载入程序 这个是壳的入口地址 因为代码段的入口地址为 00401000 这三个是壳增加的区段 按 F8 往下走程序 ...

  7. Tkinter Radiobutton

    Python GUI - Tkinter Radiobutton: 这个小部件实现了多项选择按钮,这是一种方式向用户提供许多可能的选择,让用户选择只是其中之一.   这个小部件实现了多项选择按钮,这是 ...

  8. 读<分布式一致性原理>初识zookeeper

    zookeeper是什么 zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如:数据发布/订阅,负载均衡,命名服务,分布式协调/通知 ,集群管理,Master选举 ...

  9. C# GDI+ 实现橡皮筋技术

    原文 C# GDI+ 实现橡皮筋技术 应该有很多人都在寻找这方面的资料,看看下面我做的,或许对你会有所帮助,但愿如此. 为了实现橡皮筋技术,我用了两种方法:     第一种是利用ControlPain ...

  10. 利用maven实现差异化配置

    回顾过去 生产环境,测试环境,开发环境在不同的环境下会有各种各样的配置,比如数据库链接地址,账户名,密码等等.不同环境下都需要配置,但是配置却又不同.以前分享过一篇文章,介绍了我之前A公司的差异化配置 ...