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