この記事はまったく使えません!ごめんなさい
なぜなら、CCFadeToってのがちゃんとあるから
こっ恥ずかしすぎて消えたい気分です。。。
CCFadeInTo
とかCCFadeOutTo
とかって考えてたけど
そりゃ考えると名前的にはFadeTo
ですね…
自分への戒めとして、記事自体は残しておきます。。
cocos2d-x ハージョンは2.2.1の話
問題背景
nodeを徐々に表示させる手法のひとつにCCFadeIn
がありますよね
毎度結構使う機能なんですが…
常日頃思うことがありました
これつかうとゼロかイチかっていうね
opacityが0から255っていう変化しかできないんですよね
いやいや0から150ぐらいにしたいですよっていう変化をしたい時には使えない
いままではそういうことを実現しようとおもったら、最初っから透過処理を加えた画像を用意して、CCFadeIn
を使っていました。
が、今回、それのパターンが多いかつある程度ランダムで決めたいっていうのがあって、
予め画像を用意するのが困難
という問題が発生しました
対応方法
CCFadeIn
を継承してCCFadeInTo
なるものを作って解消することに
以下はそのコード
CCFadeInTo.h
#include "cocos2d.h"
class CCFadeInTo : public cocos2d::CCFadeIn
{
public:
CCFadeInTo();
virtual ~CCFadeInTo();
virtual void update(float time);
virtual bool initWithDuration(float d, int toOpacity);
static CCFadeInTo* create(float duration, int opacity);
protected:
private:
int m_toOpacity;
};
CCFadeInTo.m
#include "CCFadeInTo.h"
USING_NS_CC;
using namespace std;
CCFadeInTo::CCFadeInTo()
{
}
CCFadeInTo::~CCFadeInTo()
{
}
CCFadeInTo* CCFadeInTo::create(float duration, int opacity)
{
CCFadeInTo* pAction = new CCFadeInTo();
pAction->initWithDuration(duration, opacity);
pAction->autorelease();
return pAction;
}
bool CCFadeInTo::initWithDuration(float d, int toOpacity)
{
if (! CCActionInterval::initWithDuration(d)) {
return false;
}
m_toOpacity = toOpacity;
return true;
}
void CCFadeInTo::update(float time)
{
CCRGBAProtocol *pRGBAProtocol = dynamic_cast<CCRGBAProtocol*>(m_pTarget);
if (pRGBAProtocol)
{
pRGBAProtocol->setOpacity((GLubyte)(m_toOpacity * time));
}
}
使い方
特段難しいことはなく、いつもの感じです(笑)
使ってみるよ!
CCSprite* hoge = CCSprite::create("hoge.png");
hoge->setVisible(false);
hoge->setOpacity(0);
this->addChild(hoge);
// 1秒かけてopacityを150まで変化させる
CCFadeInTo* fadeInTo = CCFadeInTo::create(1.f, 150);
hoge->runAction(CCSequence::create(CCShow::create(), fadeInto, NULL));
これで今のところ期待している挙動になってます
どうぞ参考にしてみてください〜
なにかあればコメント頂けると幸いですm(_ _)m