今天主要讲解一下场景切换过程中loading界面的制作。解释一下哈,在我们进行场景切换的时候,必然会有资源的加载,加载过程中,会停留在你操作的界面上。例如,你点击一按钮进入游戏场景,配置高的手机会华丽丽的进入下一场景,但是对于配置低的手机来说可就不一样喽。点击按钮之后,它会停留在按钮被点击状态,这个过程中资源加载,等资源加载完毕,才会进入下一个场景。
那,对于处在按钮被点击状态这段时间,我们是不是考虑做个loading或者什么的来屏蔽这种情况……
如果到此你还不明白,你可以看一下愤怒的小鸟,它场景切换过程中,会有loading……(对于低配手机来说)
下面说一下解决方案,我其余的奇思妙想和尝试就不和大家分享了:
大家先看看CCDirector的源码,其中有个m_pNotificationNode属性,这个是独立于scene之外的:
// Draw the Scene
void CCDirector::drawScene(void)
{
// calculate "global" dt
calculateDeltaTime();
//tick before glClear: issue #533
if (! m_bPaused)
{
m_pScheduler->update(m_fDeltaTime);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* to avoid flickr, nextScene MUST be here: after tick and before draw.
XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */
if (m_pNextScene)
{
setNextScene();
}
kmGLPushMatrix();
// draw the scene
if (m_pRunningScene)
{
m_pRunningScene->visit();
}
// draw the notifications node
if (m_pNotificationNode)
{
m_pNotificationNode->visit();
}
if (m_bDisplayStats)
{
showStats();
}
kmGLPopMatrix();
m_uTotalFrames++;
// swap buffers
if (m_pobOpenGLView)
{
m_pobOpenGLView->swapBuffers();
}
if (m_bDisplayStats)
{
calculateMPF();
}
}
从源码可知,先访问了m_pRunningScene,然后又访问了m_pNotificationNode,这两个是没有什么影响的。。。
所以,我们在按钮点击的时候可以这么操作:
CCLayerColor *layer = CCLayerColor::create(ccc4(255,0,0,255), 720, 1280);//推荐使用屏蔽层
CCDirector::sharedDirector()->setNotificationNode(layer);
CCDirector::sharedDirector()->drawScene();
想要什么loading界面,你就加什么node,ok?好,这样子我们就成功加载了loading界面,但是记得要在下一个场景的init、onNodeLoaded、onEnter或者是onEnterTransitionDidFinish处理加载的这个node,处理如下:
CCDirector::sharedDirector()->setNotificationNode(NULL);