cocos2d-x无限滚动背景

    在一些跑酷类,打飞机类的手游,背景需要无限的滚动,我也来实现一下无限跑动。原理比较简单,就是画一张头尾可以相接图片,用两个精灵加载这个图片,两个精灵的位置是相接的,然后两个精灵轮流显示,如果有一个精灵完全离开屏幕,则将精灵设置为连接在另一个精灵后的位置。我们来看看代码:

bool CTest::init()
{
    CCAssert(CCLayer::init(), "");
    
    // 设置背景
    m_pBackGround1 = CCSprite::create(STR_BACKGROUND);    // STR_BACKGROUND是图片的路径
    m_pBackGround2 = CCSprite::create(STR_BACKGROUND);    // 加载背景
    CCAssert(m_pBackGround1 && m_pBackGround2, "");
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    CCRect rcBounding = m_pBackGround1->boundingBox();
    m_pBackGround1->setPosition(ccp(rcBounding.size.width / 2, size.height / 2));    // 设置在屏幕中间
    m_pBackGround2->setPosition(ccp(rcBounding.size.width * 3 / 2, size.height / 2));// 设置精灵2连接在精灵1的后面
    this->addChild(m_pBackGround1, CHILD_ORDER_BACKGROUND);    // CHILD_ORDER_BACKGROUND精灵的层级,这里是 = 1
    this->addChild(m_pBackGround2, CHILD_ORDER_BACKGROUND);

  scheduleUpdate();
   
    return true;
}

我们还需要在update函数中,不断检查精灵的位置,并设置正确的位置

void CTest::update(float delta)
{
    // 背景无限滚动
    CCAssert(m_pBackGround1 && m_pBackGround2, "");
    m_pBackGround1->setPositionX(m_pBackGround1->getPositionX() - 1);    // 每次update都向左移动1点
    m_pBackGround2->setPositionX(m_pBackGround2->getPositionX() - 1);
    CCRect rcBounding1 = m_pBackGround1->boundingBox();
    CCRect rcBounding2 = m_pBackGround2->boundingBox();
    if (rcBounding1.getMaxX() <= 0)    // 如果完全消失在屏幕上,就移动精灵1到精灵2的后面
    {
        m_pBackGround1->setPositionX(rcBounding1.size.width * 3 / 2);
    }
    if (rcBounding2.getMaxX() <= 0)    // 如果完全消失在屏幕上,就移动精灵2到精灵1的后面
    {
        m_pBackGround2->setPositionX(rcBounding2.size.width * 3 / 2);
    }
}

就是这样不断的切换两张图的相对位置,就可以实现无限滚动了,简单吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值