原創作品,轉載請标明:http://blog.csdn.net/jackystudio/article/details/12991977
滾動字幕和公告是遊戲中經常使用到的元素,本文大緻寫一下實作方法,至于例子中具體的坐标值,請不要糾結。。。這和美工關系還是蠻大的。我PS技術太搓了。。。
1.原理
其實它們的實作都是簡單的通過調用update來更新位置達到的移動效果,和背景滾動有點類似,一旦滾動結束就重置為起點,開始新的滾動。隻是為了達到在某個區域内滾動而不至于超出這個區域,有時候會用一些前景圖來做遮蓋,是以這個時候其實字幕或者公告是有在後面滾動的,但是被遮住了,是以看起來就像是隻在某個區域内滾動。以垂直字幕滾動為例說明,如下圖。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9gzVhtmVIRmesNTYqZUbhZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNwQTOwkDM5AjMyATMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.實作
不要糾結以下各精靈的坐标位置:)
[cpp] view plain copy
- bool CTestLayer::init()
- {
- bool bRet=false;
- do
- {
- CC_BREAK_IF(!CCLayer::init());
- CCSize visibleSize=CCDirector::sharedDirector()->getVisibleSize();
- CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui_serverlist.plist");
- //垂直滾動字幕
- CCSprite* listbase=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("login_listbase.png"));//bottom底圖
- listbase->setPosition(ccp(visibleSize.width/2,visibleSize.height/2+10));
- this->addChild(listbase);
- text1=CCLabelTTF::create("1.Hi! Welcome to JackyStudio,\nMy Blog is\nblog.csdn.net/jackystudio!\n2.Hi! Welcome to JackyStudio,\nMy Blog is\nblog.csdn.net/jackystudio!\n3.Hi! Welcome to JackyStudio,\nMy Blog is\nblog.csdn.net/jackystudio!\n4.Hi! Welcome to JackyStudio,\nMy Blog is\nblog.csdn.net/jackystudio!","Arial",12);//middle文本
- text1->setHorizontalAlignment(kCCTextAlignmentLeft);//左對齊
- text1->setAnchorPoint(ccp(0.5,1));
- text1->setPosition(ccp(visibleSize.width/2,visibleSize.height/2-55));
- this->addChild(text1);
- CCSprite* fg=CCSprite::create("fg.png");//top前景
- fg->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
- this->addChild(fg);
- //水準滾動公告
- CCSprite* textbase=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("login_textbase.png"));
- textbase->setPosition(ccp(visibleSize.width/2,50));
- textbase->setScaleX(2.5f);
- this->addChild(textbase);
- text2=CCLabelTTF::create("Hi! Welcome to JackyStudio,My Blog is blog.csdn.net/jackystudio!","Arial",12);
- text2->setPosition(ccp(visibleSize.width+text2->getContentSize().width/2,50));
- text2->setColor(ccc3(255,0,0));//紅色字型
- this->addChild(text2);
- this->scheduleUpdate();//執行更新
- bRet=true;
- } while (0);
- return bRet;
- }
- void CTestLayer::update(float delta)
- {
- CCSize visibleSize=CCDirector::sharedDirector()->getVisibleSize();
- int newY=text1->getPositionY()+1;
- if (newY==500)//如果滾動到這個位置,重置
- {
- newY=visibleSize.height/2-55;
- }
- text1->setPositionY(newY);
- int newX=text2->getPositionX()-1;
- if (newX<=-text2->getContentSize().width/2)//如果滾動到這個位置,重置
- {
- newX=visibleSize.width+text2->getContentSize().width/2;
- }
- text2->setPositionX(newX);
- }
3.效果
這個效果有點小bug,就是文字覆寫到邊框上了,這是因為沒有把邊框做在top層上導緻的,實際使用注意這個問題即可。
4.源碼下載下傳
http://download.csdn.net/detail/jackyvincefu/6434549