通常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
に戻しておくことを忘れずに!