在《三勇者传说》(暂定名)的开发过程中,我遇到了一些小问题,这里记录下来,以便之后查阅以及他人分享建议。

首先是最常见的场景渐变,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效果。
今天就记录到这里,欢迎讨论~