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. 记录:Web无引用无配置方式动态调用WCF服务

    这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务 ...

  2. C#如何:启用和禁用自动绑定重定向 (微软)

    https://msdn.microsoft.com/zh-cn/library/2fc472t2.aspx 如何:启用和禁用自动绑定重定向 .NET Framework (current versi ...

  3. Hive中的用户自定义函数UDF

    Hive中的自定义函数允许用户扩展HiveQL,是一个非常强大的功能.Hive中具有多种类型的用户自定义函数.show functions命令可以列举出当前Hive会话中的所加载进来的函数,包括内置的 ...

  4. “,”、“natural join”、“natural left outer join”、“natural right outer join”的用法总结

    “,”:代表笛卡尔积: “natural join”:代表自然连接,即同名列等值连接: “natural left outer join”:表示左外连接: “natural right outer j ...

  5. OD 实验(十四) - 内嵌补丁

    内嵌补丁(inline patch): 内嵌补丁指在程序文件中把补丁代码写入文件里面达到破解的目的 如果修改某行语句会影响后面的语句,例如某语句占用 3 个字节,修改完变为 5 个字节,会覆盖后面的语 ...

  6. bash中常用的快捷键

    常用快捷键 ctrl+c 强制终止当前命令 ctrl+l 清屏(clear) ctrl+a 光标移动到命令行行首 ctrl+e 光标移动到命令行行尾 ctrl+u 从光标所在位置删除到行首 ctrl+ ...

  7. 在VritualBox中安装CentOS7

    系统:Windows10 位 详细步骤参考: Windows平台上通过VirtualBox安装centos虚拟机 安装virtual box 出现2503错误解决:c:/windows/temp 添加 ...

  8. Tkinter Listbox(列表框)

    Python - Tkinter Listbox(列表框): 列表框部件用于显示一个项目列表,用户可以选择的项目数   列表框部件用于显示一个项目列表,用户可以选择的项目数. 语法: 这里是一个简单的 ...

  9. Django 实现用户认证set_Cookie

    当用户通过认证时,set_Cookie(key, value) request.Cookie.get(key) 如果key不为空,就说明验证通过,否者重新跳转回login登录页面 对于URL urlp ...

  10. Linux监控和安全运维 1.9 zabbix增加客户端监控

    1.在客户端安装 zabbix20与服务器相对应. yum install zabbix20-agent 2.修改配置文件 vim /etc/zabbix_agentd.conf Server=127 ...