loading

今天主要讲解一下场景切换过程中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);

你可能感兴趣的:(loading)