【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, 0, sizeof(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(0, 0, 64, 64)),"button_normal.png");
       pCache->addSpriteFrame(CCSpriteFrame::create("button_selected.png",CCRectMake(0, 0, 64, 64)),"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

时间: 2024-09-20 05:50:42

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

【Cocos2d-x for WP8 学习整理】(4)CCTableView 实现《天天爱消除》中的得分榜

原文:[Cocos2d-x for WP8 学习整理](4)CCTableView 实现<天天爱消除>中的得分榜 接上回 CCScrollView 继续,在GUI 里还有个 CCScrollView 的子类---CCTableView . 这个名字应该是从 IOS 里的 UITableView来的,其实是跟WP8的 Listbox 效果一样,实现 大数据的虚拟化展示, 不管在应用还是游戏里都是很常见的控件. 比如下面的 <天天爱消除> 的分数展示   下面我们用 CCTableVi

【Cocos2d-x for WP8 学习整理】(1)创建一个新项目

原文:[Cocos2d-x for WP8 学习整理](1)创建一个新项目 喜大普奔                         10.1假期之前看到了一个很振奋的消息,就是随着Cocos2d-x 2.2的发布,WP8/WIN8有史以来第一次的合并到主版本了. 之前 V2.X 在preview 版本持续了好久,搞的我一直以为微软已经放弃这么个强大的引擎了,只去支持Unity了,结果很意外的在 2.2的更 新版本,这一次,终业余兵终于转职业了,作为一直以来都被边缘化的WP开发者,我表示十分特别

【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源

原文:[Cocos2d-x for WP8 学习整理](2)Cocos2d-Html5 游戏 <Fruit Attack> WP8移植版 开源 这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支持WAV格式 的音乐,而我没有去转格式, 所以无法播放声音: 提示手势的显示位置有问题:源代码的执行效率过低等,但是对于初级的学习应该还是有一定参考意义的

Wix学习整理(5)——安装时填写注册表

原文:Wix学习整理(5)--安装时填写注册表 一 Microsoft操作系统的注册表 什么是注册表? 注册表是Mircrosoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.详细介绍参考维基百科--注册表. 如何操作注册表? 通过工具Windows操作系统自带工具regedit.exe即可对注册表进行添加.删除.修改等操作. 注册表的五个分支 注册表有五种分支:HKMU.HKCR.HKCU.HKLM和HKU.下面对这五种注册表分支进行简单介绍, HKMU:全称HKE

Wix学习整理(1)——快速入门HelloWorld

原文:Wix学习整理(1)--快速入门HelloWorld 1 Wix简介 Wix是Windows Installer XML的简称,其通过类XML文件格式来指定了用于创建Windows Installer安装包数据库的元素.关于Wix的详细介绍,查看Wix Tutorial. 通过http://wix.codeplex.com/,我们下载最新的Wix toolset,并进行安装. 2 1+1=2 动手实践是感受最深的方式.下面我们就通过制作一个简单的HelloWorld安装包来感受一下Wix.

Wix学习整理(4)——关于WiX文件格式和案例HelloWorld的分析

原文:Wix学习整理(4)--关于WiX文件格式和案例HelloWorld的分析 关于WiX文件格式 .wxs是WiX的源文件扩展名..wxs文件以类XML文件的格式来指定了要构造Windows Installer安装数据包.msi文件所需的信息. .wxs的文件格式为: <?xml version="1.0"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> - </Wi

Wix学习整理(3)——关于Windows Installer和MSI

原文:Wix学习整理(3)--关于Windows Installer和MSI 关于Windows Installer Windows Installer是微软Windows操作系统自带的一个软件安装和配置服务,其实现了软件安装的业务逻辑:如何安装软件?如何修改注册表键值?如何创建快捷方式?如何操作网站目录或注册服务?等等.Windows Installer技术由两部分组成:客户端安装程序服务(Msiexec.exe)和Microsoft软件安装包文件(MSI). 关于MSI Windows In

Wix学习整理(6)——安装快捷方式

原文:Wix学习整理(6)--安装快捷方式 一 为HelloWorld案例添加安装快捷方式 通常我们安装一个应用软件的时候,都喜欢在桌面或开始菜单中添加快捷方式以便我们快速访问.现在我们就在上篇添加注册信息的基础上为HelloWorld的安装包添加安装快捷方式.下面我们将以安装开始菜单快捷方式为实例详细地阐述一下Wix的关于安装快捷方式的基础知识. 首先,我们要定义好目录结构. 开始菜单快捷方式的安装目录结构与应用软件的实际安装目录结构不一样. <Directory Id="Program

Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式

原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些在安装时添加的内容,在卸载时也会自动地删除.但是,到目前为止,我们的卸载只有两种方式:通过原始安装包或控制面板中的卸载或更改程序.现在,我们来学习Wix如何为我们的HelloWorld在安装时在开始菜单中提供卸载的快捷方式. 一 添加卸载快捷方式 添加卸载的快捷方式也是通过<Shortcut>元素