播放背景,两个背景的图片是一样的,紧挨着循环播放,以下代码写在playBackground()方法中,并在GameScene.cpp的init方法中调用。
void GameScene::playBackground()
{auto winSize = Director::getInstance()->getWinSize(); //获得OpenGL视图的大小,不是可见屏幕的大小,以点为单位
int delta = 10; //补缝用的,两个背景紧挨着移动可能出现缝隙,轮播图的像素高应该比设备屏幕高的大一点(+0.01)(其实可以删去) 2.后面的图应该稍微往前靠一点 这样就不会有缝隙了
auto bg1 = Sprite::createWithSpriteFrameName("background.png");
bg1->setScaleX(winSize.width / bg1->getContentSize().width); //让地图的宽和屏幕一样宽 bg1->setScaleY(winSize.height / bg1->getContentSize().height + 0.01); //让地图的高比屏幕高一点(其实可以设置成一样高,这里+0.01可以删除) bg1->setAnchorPoint(Vec2(0, 0)); addChild(bg1);auto move1 = MoveBy::create(30, Vec2(0, -winSize.height));
auto callfunc1 = CallFunc::create([bg1](){ //设置回调函数,在移动完地图后,执行这个方法,回到最初的位置 bg1->setPosition(Vec2(0, 0)); }); auto action1 = Sequence::create(move1, callfunc1, nullptr); bg1->runAction(RepeatForever::create(action1));
auto bg2 = Sprite::createWithSpriteFrameName("background.png");
bg2->setScaleX(winSize.width / bg2->getContentSize().width); //让地图的宽和屏幕一样宽 bg2->setScaleY(winSize.height / bg2->getContentSize().height + 0.01); //让地图的高比屏幕高一点(其实可以设置成一样高,这里+0.01可以删除) bg2->setAnchorPoint(Vec2(0, 0)); bg2->setPosition(Vec2(0, bg1->getPositionY() + winSize.height - delta)); addChild(bg2); auto move2 = MoveTo::create(30, Vec2(0, 0)); auto callfunc2 = CallFunc::create([bg2, bg1, winSize, delta](){ //设置回调函数,在移动完地图后,执行这个方法,回到最初的位置 bg2->setPosition(Vec2(0, bg1->getPositionY() + winSize.height - delta)); }); auto action2 = Sequence::create(move2, callfunc2, nullptr); bg2->runAction(RepeatForever::create(action2));}