テクスチャーループとは、1つの大きなスプライトの中に、スプライトより小さなテクスチャーをループして貼り付ける方法です。
背景画像に使ったり、色々なところで重宝します。
やり方は、OpenGL ES の知識がちょっと必要ですが、難しくはありません。
今回は、cocos2d テンプレートプロジェクトの Hello World を改造して取り組みました。
テクスチャは以下の4種類の画像を用意します。
左から64×64、64×128、64×100、50×128のサイズです。
4つのサイズのテクスチャを用意 |
ファイル名は Background.m と Background.h にしました。
// Background.h #import <foundation/foundation.h> #import "cocos2d.h" @interface Background : CCSprite { } + (id)backgroundWithRect:(CGRect)rect; - (id)initWithRect:(CGRect)rect; @end
// Background.m #import "Background.h" @implementation Background + (id)backgroundWithRect:(CGRect)rect { return [[[self alloc] initWithRect:rect] autorelease]; } - (id)initWithRect:(CGRect)rect { if ((self = [super initWithFile:@"worm64x64.png" rect:rect])) { ccTexParams params = {GL_LINEAR,GL_LINEAR,GL_REPEAT,GL_REPEAT}; [texture_ setTexParameters:¶ms]; self.anchorPoint = CGPointZero; } return self; }backgroundWithRect: メソッドでスプライトのインスタンス化を行います。その際にrect パラメータで、スプライトのサイズとポジションを指定します。
initWithRect: メソッドで、ループテクスチャーの設定を行います。
ccTexParams 変数に、テクスチャーの縦横伸縮方法(サンプルではLinear)、縦横ループ方法(サンプルではRepeat)を格納し、CCSprite の texture_ メンバ変数にテクスチャーパラメータとして設定してやります。これで完了です。
早速表示してみましょう。HelloWorldLayer クラスの init メソッドを以下のように修正します。
// HelloWorldLayer.m #import "Background.h" -(id) init { if( (self=[super init])) { CGSize size = [[CCDirector sharedDirector] winSize]; Background *bg = [Background backgroundWithRect:CGRectMake(0,0,size.width,size.height)]; [self addChild:bg]; } return self; }結果は以下のようになりました。テクスチャーのサイズは64×64です。
ちなみにこれをループさせないと、以下のようになります。
テクスチャーの貼付け位置は、スプライト内の左上が起点となっています。
64×128のテクスチャーの場合は以下のようになります。
テクスチャーサイズが2のn乗でない場合はどうでしょうか。
64×100のテクスチャーで試してみました。
縦のループが128(2の7乗)に補正されていますが、テクスチャーは元のままです。
同じく50×128のテクスチャーで試してみます。
横のループが64(2の6乗)に補正されているのが分かります。
このように OpenGL ES では、テクスチャーのループが2のn乗サイズで行われることが分かって頂けたかと思います。
0 件のコメント:
コメントを投稿