实现淡入淡出成效的蒙版

实现淡入淡出效果的蒙版
  这是一个系列的文章,详情可点击关于这两年所经历项目的系列总结

  接下来要做的第一个小功能就是,实现一个有淡入淡出效果的蒙版。cocos2dx里面的蒙版有CCLayerColor,直接使用会比较生硬。这里使用CCFade动画来给它实现一个淡入淡出的效果。
这个类给我它取名GameMaskLayer。

.h文件如下
#ifndef _GAME_MASK_LAYER_H_
#define  _GAME_MASK_LAYER_H_

#include "cocos2d.h"

USING_NS_CC;

class GameMaskLayer : public CCLayerColor
{
public:
	enum {MaskLayerZOder=-100, MaskLayerTag=100, FadeOutTag=101, FadeInTag=102};
	GameMaskLayer(void);
	~GameMaskLayer(void);
	
	static GameMaskLayer* create(ccColor4B color = ccc4(0, 0, 0, 100));
	static GameMaskLayer* create(CCNode* pNode, ccColor4B color = ccc4(0, 0, 0, 100));
	static GameMaskLayer* create(CCNode* pNode, int zOrder, ccColor4B color = ccc4(0, 0, 0, 100));
	static GameMaskLayer* create(CCNode* pNode, int zOrder, int tag, ccColor4B color = ccc4(0, 0, 0, 100));
	virtual bool initLayer(CCNode* pNode, int zOrder, int tag, ccColor4B color);
	void doFadeOut(CCNode* pParent);

private:
	void onFadeInEnded(CCNode* pParent);
	void onFadeOutEnded(CCNode* pParent);
	virtual void visit();

private:
	GLubyte mOpacity;
	static GameMaskLayer* mInstance;
};
#endif


.cpp文件如下
#include "GameMaskLayer.h"

GameMaskLayer::GameMaskLayer(void)
{
	mOpacity = 0;
}

GameMaskLayer::~GameMaskLayer(void)
{
}

GameMaskLayer* GameMaskLayer::create(ccColor4B color)
{
	return create(NULL, MaskLayerZOder, MaskLayerTag, color);
}

GameMaskLayer* GameMaskLayer::create(CCNode* pNode, ccColor4B color)
{
	return create(pNode, MaskLayerZOder, MaskLayerTag, color);
}

GameMaskLayer* GameMaskLayer::create(CCNode* pNode, int zOrder, ccColor4B color)
{
	return create(pNode, zOrder, MaskLayerTag, color);
}

GameMaskLayer* GameMaskLayer::create(CCNode* pNode, int zOrder, int tag, ccColor4B color)
{
	GameMaskLayer *mInstance = new GameMaskLayer();
	if (mInstance != NULL && mInstance->initLayer(pNode, zOrder, tag, color))
	{
		mInstance->autorelease();
		return mInstance;
	}
	CC_SAFE_DELETE(mInstance);
	return NULL;
}

bool GameMaskLayer::initLayer(CCNode* pNode, int zOrder, int tag, ccColor4B color)
{
	GLubyte oldOpactiy = this->getOpacity();	

	if (!CCLayerColor::initWithColor(color)) return false;
	
	this->setOpacity(oldOpactiy);
	mOpacity = color.a;
	this->_setZOrder(zOrder);
	this->setPosition(ccp(0, 0));
	this->setTag(tag);

	if (oldOpactiy != mOpacity)
	{
		this->stopActionByTag(FadeOutTag);
		this->stopActionByTag(FadeInTag);

		CCAction *pAction = CCSequence::create(CCFadeTo::create(0.2f, mOpacity),
											CCCallFuncN::create(this, callfuncN_selector(GameMaskLayer::onFadeInEnded)), NULL);
		pAction->setTag(FadeInTag);
		this->runAction(pAction);
	}

	if (pNode != NULL)
	{
		pNode->addChild(this, zOrder);
	}else {
		return false;
	}

	return true;
}

void GameMaskLayer::doFadeOut(CCNode* pParent)
{
	GLubyte oldOpactiy = this->getOpacity();
	if(oldOpactiy > 10)
	{
		this->stopActionByTag(FadeOutTag);
		this->stopActionByTag(FadeInTag);
		CCFiniteTimeAction* pAction = CCSequence::create(CCFadeTo::create(0.2f, 0), 
															CCCallFuncN::create(this, callfuncN_selector(GameMaskLayer::onFadeOutEnded)), NULL);
		pAction->setTag(FadeOutTag);
		this->runAction(pAction);
	} else {
		CCFiniteTimeAction* pAction = CCSequence::create(CCDelayTime::create(0.05f), 
			CCCallFuncN::create(this, callfuncN_selector(GameMaskLayer::onFadeOutEnded)), NULL);
		this->runAction(pAction);
	}
}

void GameMaskLayer::onFadeInEnded(CCNode* pParent)
{
	
}

void GameMaskLayer::onFadeOutEnded(CCNode* pNode)
{
	this->stopActionByTag(FadeOutTag);
	this->stopActionByTag(FadeInTag);
	this->removeFromParentAndCleanup(true);
}

void GameMaskLayer::visit()
{
	CCNode* pParent = this->getParent();
	float oldScale = pParent->getScale();
	float oldScaleX = pParent->getScaleX();
	float oldScaleY = pParent->getScaleY();
	this->setScale(2.0f/oldScale);
	this->setScaleX(2.0f/oldScaleX);
	this->setScaleY(2.0f/oldScaleY);
	CCLayerColor::visit();
	this->setScale(oldScale);
	this->setScaleX(oldScaleX);
	this->setScaleY(oldScaleY);
}


关于这个功能的实现,相对简单没啥好说的,所以贴出全部代码,自己看吧。如果以后实现的功能更复杂些,就会贴出相关代码,附加自己的实现思路。