智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

cocos2d-x CCScrollView

Posted on   Bill Yuan  阅读(7395)  评论(0编辑  收藏  举报

转自:http://www.cnblogs.com/dcxing/archive/2012/12/31/2840217.html

ScrollView一般用在游戏的关卡选择这种类似的场景还有帮助这种场景之中,当然,也可以用其他一些选择菜单的场景。用途还是比较广泛的嘛。

首先CCScrollView 在 Cocosd-x 的扩展库里面,要是使用的话,需要引入扩展包,然后添加命名空间

#include "cocos-ext.h"
USING_NS_CC_EXT;//cocos2dx定义的宏

  然后实现CCScrollViewDelegate,这个其实是和UISCrollView和相似的。

  必须实现的两个方法。

virtual void scrollViewDidScroll(CCScrollView* view);
virtual void scrollViewDidZoom(CCScrollView* view);

  现在我们开始创建CCScrollView对象了。当然我们最好还是再创建一个Layer用来作为CCScrollView的Container。

复制代码
scrollView=CCScrollView::create();//创建一个scrollView

continerLayer=CCLayer::create();
CCSprite *sprite1=CCSprite::spriteWithFile("image1.jpg");
sprite1->setPosition(ccp(240+0*480, 160));
continerLayer->addChild(sprite1);
CCSprite *sprite2=CCSprite::spriteWithFile("image2.jpg");
sprite2->setPosition(ccp(240+1*480, 160));
continerLayer->addChild(sprite2);
continerLayer->setAnchorPoint(CCPointZero);
continerLayer->setPosition(CCPointZero);
scrollView
->setAnchorPoint(CCPointZero); scrollView->setPosition(CCPointZero); // 显示显示的区域 scrollView->setViewSize(CCSizeMake(480, 320));//设置view的大小 scrollView->setContentOffset(CCPointZero);
continerLayer
->setContentSize(CCSizeMake(960, 320));//设置滚动区域的大小 // 显示滑动的区域大小 scrollview的实际大小 scrollView->setContentSize(CCSizeMake(960, 320));//设置scrollview区域的大小 scrollView->setContainer(continerLayer); //因为要自己实现触摸消息,所以这里设为false//设置需要滚动的内容 scrollView->setTouchEnabled(true); scrollView->setDirection(kCCScrollViewDirectionHorizontal); //设置滚动的方向,有三种可以选择 scrollView->setDelegate(this); this->addChild(scrollView);
复制代码

ok,这样的话我们就创建完ScrollView了,但是要想做到好一点的效果还是要做一些其他处理。这里主要是设置滑动之后自动让ScrollView自动调整大小。

复制代码
bool CCScrollViewLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    return true;
}
 
voidCCScrollViewLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    CCLOG("move");
}

 

voidCCScrollViewLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

{

    adjustScrollView();

}

voidCCScrollViewLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
    adjustScrollView();
}

void CCScrollViewLayer::adjustScrollView()
{
    // 关闭CCScrollView中的自调整
    scrollView->unscheduleAllSelectors();
    int x = scrollView->getContentOffset().x;
    CCLOG("offset=%d",x);

    int offset = (int) x % 480;
    // 调整位置
    CCPoint adjustPos;
    // 调整动画时间
    float adjustAnimDelay;
    // 向右滑动是正向左滑动是负
    if (offset < -240) {
    // 计算下一页位置,时间
        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(480 + offset, 0));
        adjustAnimDelay = (float) (480 + offset) / ADJUST_ANIMATION_VELOCITY;
    }
    else {
        // 计算当前页位置,时间
        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(offset, 0));
        // 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数
        adjustAnimDelay = (float) abs(offset) / ADJUST_ANIMATION_VELOCITY;
    }
    // 调整位置

    scrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);
}
复制代码

当然再onEnter方法中加入

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);

保证当前layer和scrollview都能获得touch事件。

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示