采用双层背景,这样效果更好
.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); }