Cocos2dx 半透明遮罩 ,UI震动效果,渐变场景过度
在《三勇者传说》(暂定名)的开发过程中,我遇到了一些小问题,这里记录下来,以便之后查阅以及他人分享建议。
首先是最常见的场景渐变,cocos2dx自身有一定数量的场景渐变效果,原本无需做太多说明,不过既然算是一种小伎俩,这里也备注一下。
CCScene* pLoginScene = CLoginScene::scene();
if( pLoginScene )
{
float fTime = 1.5f;
CCTransitionScene * pTransScene = CCTransitionFade ::create( fTime , pLoginScene );
CCDirector::sharedDirector()->replaceScene( pTransScene );
}
然后是半透明遮罩,这在游戏需要进行暂停时,以及弹出信息窗口时非常常用。
ShadeLayer.h
#pragma once
//--------------------------------------------------------------------
#include "CommonHead.h"
//--------------------------------------------------------------------
class CShadeLayer : public CCLayer
{
public:
static CShadeLayer* create( CCLayer* p_pUILayer );
bool init( CCLayer* p_pUILayer );
private:
void MenuCallback(CCObject* pSender){}
};
ShadeLayer.cpp
#include "ShadeLayer.h"
//--------------------------------------------------------------------
CShadeLayer* CShadeLayer::create( CCLayer* p_pUILayer )
{
CShadeLayer* pLayer = new CShadeLayer;
if( pLayer && pLayer->init( p_pUILayer ) )
{
pLayer->autorelease();
return pLayer;
}
else
{
delete pLayer;
pLayer = NULL;
return NULL;
}
}
//--------------------------------------------------------------------
bool CShadeLayer::init( CCLayer* p_pUILayer )
{
bool bRet = false;
do
{
CC_BREAK_IF(!CCLayer::init());
CCAssert( p_pUILayer, "p_pUILayer == NULL!");
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCLayerColor* layerColor = CCLayerColor::create();
layerColor->setColor(ccc3(0, 0, 0));
layerColor->setOpacity(150);
layerColor->setContentSize(CCSizeMake(visibleSize.width, visibleSize.height));
this->addChild(layerColor);
CCMenuItemImage* item = CCMenuItemImage::create();
item->setContentSize(CCSizeMake(visibleSize.width, visibleSize.height));
item->initWithTarget(this, menu_selector(CShadeLayer::MenuCallback));
CCMenu* menu = CCMenu::create(item, NULL);
menu->setTouchPriority( SHADER_LAYER_TOUCH_PRIORITY );
this->addChild(menu);
this->setTag( SHADE_LAYER_TAG );
bRet = true;
} while (0);
return bRet;
}
//——————————————————————–
我们上面的代码是使用一个巨大的CCMenu去截获消息,虽然方法不传统,但是的确高效。如果使用传统的建议方式,Layer设置接收消息并重载消息回调四个函数,这个方法也行的通,但是代价较高,性能上也无优化,并不划算。注意的是,里面的宏 SHADER_LAYER_TOUCH_PRIORITY 必须小于UI默认的消息级别 -128,建议为-129.那么我们假如在这个遮罩层上放置新的UI或者Layer一定注意将新的UI消息级别高于这个 SHADER_LAYER_TOUCH_PRIORITY,即建议为-130以下。
它的调用方式如下: // 在某个Scene中添加遮罩层 this->addChild( CShadeLayer::create(this), 100 );
最后,记录一下UI显示时的震动效果。我们通常显示一个UI,并不希望它突然就出现在屏幕上,而是经过一个极短的动画过程再显示。我这里介绍一种震动效果。代码如下:
CCAction* shakeAction = CCSequence::create(CCScaleTo::create(0.0, 0.0),
CCScaleTo::create(0.12, 1.08),
CCScaleTo::create(0.10, 0.92),
CCScaleTo::create(0.10, 1.04),
CCScaleTo::create(0.10, 0.96),
CCScaleTo::create(0.10, 1.0), NULL);
// 增加UI层
CUIPanelLayer* pLayer = CUIPanelLayer::create();
if( pLayer )
{
pLayer ->runAction( shakeAction );
this->addChild( pLayer );
}
这样就模拟形成了一个震动显示的UI效果。
今天就记录到这里,欢迎讨论~