采用双层背景,这样效果更好
.h
~~~
class BackgroundMove : public Layer
{
public:
BackgroundMove();
~BackgroundMove();
virtual bool init();
virtual void onEnterTransitionDidFinish(); //等进入场景之后在进行背景的移动
CREATE_FUNC(BackgroundMove);
public:
void move(float dt);
private:
Sprite* m_background1;
Sprite* m_background2;
Sprite* m_background3;
Sprite* m_background4;
enum
{
OFFSET = 3
};
};
~~~
背景无限滚动的方式有很多,只要不出现黑边即可
.cpp
~~~
BackgroundMove::BackgroundMove() : m_background1(NULL), m_background2(NULL), m_background3(NULL), m_background4(NULL)
{
}
BackgroundMove::~BackgroundMove()
{
CC_SAFE_DELETE(m_background1);
CC_SAFE_DELETE(m_background2);
CC_SAFE_DELETE(m_background3);
CC_SAFE_DELETE(m_background4);
}
bool BackgroundMove::init()
{
bool bRect = false;
do
{
if (!Layer::init())
return false;
//加载背景图片
m_background1 = Sprite::createWithSpriteFrameName("backgroundTollgate2.png");
m_background1->setPosition(Point(0,0));
m_background1->setAnchorPoint(Vec2(0, 0));
this->addChild(m_background1,1);
m_background2 = Sprite::createWithSpriteFrameName("backgroundTollgate2.png");
m_background2->setPosition(Point(0, 0));
m_background2->setAnchorPoint(Vec2(0, 0));
m_background2->setFlipY(true);
this->addChild(m_background2,1);
//加载背景图片
m_background3 = Sprite::createWithSpriteFrameName("backgroundTollgateThree.png");
m_background3->setPosition(Point(0, 0));
m_background3->setAnchorPoint(Vec2(0, 0));
this->addChild(m_background3, 0);
m_background4 = Sprite::createWithSpriteFrameName("backgroundTollgateThree.png");
m_background4->setPosition(Point(0, 0));
m_background4->setAnchorPoint(Vec2(0, 0));
m_background4->setFlipY(true);
this->addChild(m_background4, 0);
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/BackgroundMusic.mp3", true);
bRect = true;
} while (0);
return bRect;
}
void BackgroundMove::onEnterTransitionDidFinish()
{
Layer::onEnterTransitionDidFinish();
this->schedule(SEL_SCHEDULE(&BackgroundMove::move), 0.01f);
}
void BackgroundMove::move(float dt)
{
Vec2 origin = Director::getInstance()->getVisibleOrigin();
m_background1->setPositionY(m_background1->getPositionY() - OFFSET);
m_background2->setPositionY(m_background1->getPositionY() + m_background1->getContentSize().height);
if (m_background2->getPositionY() <= origin.y)
m_background1->setPositionY(0);
m_background3->setPositionY(m_background3->getPositionY() + OFFSET);
m_background4->setPositionY(m_background3->getPositionY() - m_background3->getContentSize().height);
if (m_background4->getPositionY() >= origin.y)
m_background3->setPositionY(0);
}
~~~