当前位置: 首页 > news >正文

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

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

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

幸运的是cocos2d-x意识到了这个问题,自从2.0版本之后逐步加入了几个常用控件,在这里我们详细说一下 CCScrollView 。

CCScrollView 经常被用在场景选择界面里,以《捕鱼达人》为例,几个场景各个占据一个屏幕的宽度,滑动即可切换不同的场景。

   

CCScrollView 类文件位于 cocos2d-x 目录下的 extensions\GUI\ccscrollview ,默认新项目是没有添加对它的引用的,如果项目要使用的话需要手动添加对 libExtensions 的引用,具体的方法参加上篇。 

看源码可知,CCScrollView 继承自 CCLayer ,它内部维护了一个CCNode* 类型的Container,它的实现原理是将要展示的元素都添加到Container里,然后在响应触摸事件的代码里不断的修改 Container的位置,

这样便达到了滑动展示的效果。

 

使用方法: 

bool GalleryLayer::init()
{
     bool bRet =  false;
     do
    {
       CC_BREAK_IF( !CCLayer::init() );

       m_nCurPage =  1;

       CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
       CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

       CCLayer *pLayer = CCLayer::create();

        char helpstr[ 30] = { 0};
        for ( int i =  1; i <=  3; ++ i)
       {
           memset(helpstr,  0sizeof(helpstr));
           sprintf(helpstr, " bg_%02d.png ",i);

           CCSprite *pSprite = CCSprite::create(helpstr);

           pSprite->setScale(MIN(visibleSize.width /  960, visibleSize.height /  640));

           pSprite->setPosition(ccp(visibleSize.width * (i- 0.5f), visibleSize.height /  2));
           pLayer->addChild(pSprite);
       }
       
       m_pScrollView = CCScrollView::create(CCSizeMake(visibleSize.width, visibleSize.height), pLayer);
       m_pScrollView->setContentOffset(CCPointZero);
        // m_pScrollView->setTouchEnabled(false);

       m_pScrollView->setDelegate( this);
       m_pScrollView->setDirection(kCCScrollViewDirectionHorizontal);

       pLayer->setContentSize(CCSizeMake(visibleSize.width* 3, visibleSize.height));

        this->addChild(m_pScrollView);

       CCSpriteFrameCache *pCache =  CCSpriteFrameCache::sharedSpriteFrameCache();
   
       pCache->addSpriteFrame(CCSpriteFrame::create( " button_normal.png ",CCRectMake( 006464)), " button_normal.png ");
       pCache->addSpriteFrame(CCSpriteFrame::create( " button_selected.png ",CCRectMake( 006464)), " button_selected.png ");

        for ( int i =  1; i <=  3; ++ i)
       {
           CCSprite *pPoint = CCSprite::createWithSpriteFrameName( " button_normal.png ");
           pPoint->setTag(i);
           pPoint->setPosition(ccp( origin.x + (visibleSize.width -  3 * pPoint->getContentSize().width)/ 2 + pPoint->getContentSize().width * (i- 1), origin.y +  30));
            this->addChild(pPoint);
       }

        CCSprite *pPoint = (CCSprite *) this->getChildByTag( 1);
        pPoint->setDisplayFrame(pCache->spriteFrameByName( " button_selected.png "));
    
        bRet =  true;
    }
     while( 0);

     return bRet;
}

但是对于场景选择来说,还需要个滑动完成自动定位的功能,自动的将当前的内容滚动到屏幕的中央。CCScrollView提供了一个手动设置位移的方法,

void setContentOffset(CCPoint offset, bool animated = false); 

我们只需要在CCScrollView所在的Layer里的 touchEnded事件里调用该函数,然后传入计算出来的值即可。

 

实现方法: 

void GalleryLayer::adjustScrollView( float offset)
{
     // 关掉控件自己的调整.

    //这个很关键,否者会冲突.
    m_pScrollView->unscheduleAllSelectors();

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    CCSpriteFrameCache *pCache =  CCSpriteFrameCache::sharedSpriteFrameCache();

    CCSprite *pPoint = (CCSprite *)this->getChildByTag(m_nCurPage);
    pPoint->setDisplayFrame(pCache->spriteFrameByName("button_normal.png"));

    if (offset < 0)
    {
        m_nCurPage ++;
    }
    else
    {
        m_nCurPage --;
    }

    if (m_nCurPage <1)
    {
        m_nCurPage = 1;
    }
    else if(m_nCurPage > 3)
    {
        m_nCurPage = 3;
    }

    pPoint = (CCSprite *)this->getChildByTag(m_nCurPage);
    pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected.png"));

    CCPoint  adjustPos = ccp(origin.x - visibleSize.width * (m_nCurPage-1), 0);
    m_pScrollView->setContentOffset(adjustPos, true);
}

 

此外,CCScrollView还提供设置Delegate,类定义如下:

class CCScrollViewDelegate
{
public:
     virtual ~CCScrollViewDelegate() {}
     virtual  void scrollViewDidScroll(CCScrollView* view) =  0;
     virtual  void scrollViewDidZoom(CCScrollView* view) =  0;

}; 

我们可以通过 setDelegate 方法传入接受响应的对象,每当滑动或者放大的时候,就会调用响应的方法。可以在接受委托的对象里实现各种效果。

 

示例代码下载:

http://download.csdn.net/detail/u010810951/6441983


参考文章:

http://codingnow.cn/cocos2d-x/1024.html

 

欢迎有兴趣的童鞋加入Cocos2d-x 开发群  qq: 264152376

相关文章:

  • ubuntu下安装oracle
  • Asp.net MVC
  • VCS etc. git
  • Android 中的BroadCastReceiver
  • linux 生成随机密码和wordlist常用方法
  • gnome-shell如何删除菜单项
  • maven学习系列一:maven的安装
  • 软件性能评估
  • Oracle 11g系列:数据库
  • 【Node.js】初体验之安装和HelloWorld
  • 调整弹出对话框在ASP.NET应用程序的大小
  • Javascript延时函数
  • yum源
  • 设计模式之四(抽象工厂模式第二回合)
  • ListView小知识整理:滑动背景、Item间隙等
  • Idea+maven+scala构建包并在spark on yarn 运行
  • MySQL用户中的%到底包不包括localhost?
  • nodejs:开发并发布一个nodejs包
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python利用正则抓取网页内容保存到本地
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 判断客户端类型,Android,iOS,PC
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何编写一个可升级的智能合约
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 硬币翻转问题,区间操作
  • No resource identifier found for attribute,RxJava之zip操作符
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 从如何停掉 Promise 链说起
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (+4)2.2UML建模图
  • (03)光刻——半导体电路的绘制
  • (7)STL算法之交换赋值
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)fock函数详解
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net CF下精确的计时器
  • .net 中viewstate的原理和使用
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET开发者必备的11款免费工具
  • .NET连接数据库方式
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @Bean有哪些属性
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @RequestBody与@ResponseBody的使用
  • [100天算法】-实现 strStr()(day 52)