テクスチャーループとは、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 件のコメント:
コメントを投稿