5
5

More than 5 years have passed since last update.

【Cocos2d-x】setScaleを使わずにスプライトを拡縮表示する方法

Posted at

通常CCSpriteを拡縮するにはsetScaleを使うのが一般的です。

ですが、CocosBuilderをはじめとしてプログラムで記述する以外からスケーリングされる場合この方法は使えません。アニメーションの再生中にsetScaleした値が上書きされてしまうからです。

これはたとえば、CocosBuilderで作ったアニメーションしているスプライトをプログラムで拡大させたままアニメーションはCocosBuilderそのまま使いたい、という時に問題になります。

上記の書き方だと特殊な事例のように思えますがCocosBuilderでデータを作ったものの、後からTexture容量削減のために、Textureサイズは半分に、でも表示される画像はそのままにしたい、という時にも当てはまります。

ということで、setScaleを使わずに拡縮するには、下記のメソッドをオーバーライドします。

void CCSprite::setVertexRect(const cocos2d::CCRect &rect);
void CCSprite::setContentSize(const cocos2d::CCSize &contentSize);

これらを下記のようにすると、2倍に拡大されて表示されるはずです。

void MySprite::setVertexRect(const cocos2d::CCRect &rect) {
    CCSprite::setVertexRect(rect);
    m_obUnflippedOffsetPositionFromCenter = m_obUnflippedOffsetPositionFromCenter * 2;
    m_obRect.size = m_obRect.size * 2;
}

void MySprite::setContentSize(const cocos2d::CCSize &contentSize) {
    CCSprite::setContentSize(contentSize * 2);
}

詳しい中身はCCSpriteのソースを追って頂くとして、上記のように継承したクラスを使うと簡単にsetScaleを使わなくても拡大することができます。

ただし、基本的にこれはスプライト生成時にのみ呼ばれるので、デフォルトのスケーリング、という意味合いが強いです。

上記を踏まえて、CocosBuilderで作ったデータに含まれるCCSpriteを拡大させたい場合は、下記のようにするのが簡単です。

class MySprite : public CCSprite {
public:
    CREATE_FUNC(MySprite);
    void setVertexRect(const cocos2d::CCRect &rect);
    void setContentSize(const cocos2d::CCSize &contentSize);
};

class MySpriteLoader : public CCSpriteLoader
{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MySpriteLoader, loader);
protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MySprite);
};

このようなクラスを作成し、ccbiファイルを読み込む時のCCNodeLoaderLibrary

CCNodeLoaderLibrary* ccNodeLoaderLib = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
ccNodeLoaderLib->unregisterCCNodeLoader("CCSprite");
ccNodeLoaderLib->registerCCNodeLoader("CCSprite", MySpriteLoader::loader());

としてやると、CCSpriteをロードするときにMySpriteが使われ拡縮した大きさで表示されるようになります。

拡縮したくない場合には

CCNodeLoaderLibrary* ccNodeLoaderLib = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
ccNodeLoaderLib->unregisterCCNodeLoader("CCSprite");
ccNodeLoaderLib->registerCCNodeLoader("CCSprite", CCSpriteLoader::loader());

として、デフォルトで使われるCCSpriteLoaderに戻しておくことを忘れずに!

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5