iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
先日のCocoa勉強会で話題となってテクスチャ・アトラスについて調べてみた。
グラフィックのハードウェアからの制限だと思うが、OpenGL ESでは扱えるテクスチャ画像の最大サイズやユニット数に制限がある。このユニット数の制限への対策として、複数の画像を合体して一つのテクスチャで扱うことによって利用するユニット数を減し、このままでは扱いづらいので元の画像単位で利用できるする仕組みがテクスチャ・アトラスと呼ばれる方法で、Sprite Kitには、この方法を簡単に利用する為の機能が用意されている。
宇宙船に10枚の画像をパラパラ動画で表示させる場合、テクスチャ・アトラスを使わないと以下のようになる。
NSMutableArray *textureArray = [[NSMutableArray alloc] init];
for (int i = 1; i <= 10; i++) {
NSString *filename = [NSString stringWithFormat:@"spaceship%02d", i];
SKTexture *texture = [SKTexture textureWithImageNamed:filename];
[textureArray addObject:texture];
}
SKAction *animationAction = [SKAction animateWithTextures:textureArray timePerFrame:0.1];
[hull runAction:[SKAction repeatActionForever:animationAction]];
テクスチャ・アトラスを利用場合は、サフィックスが.atlasのフォルダを用意して、そこに画像ファイルを格納する。
.atlasのフォルダの画像をSKTextureAtlasクラスで読み込んで、そこからファイル名で取り出すように、さっきのコードを変更する。
NSMutableArray *textureArray = [[NSMutableArray alloc] init];
SKTextureAtlas *spaceshipTextureAtlas = [SKTextureAtlas atlasNamed:@"spaceship"];
for (int i = 1; i <= 10; i++) {
NSString *filename = [NSString stringWithFormat:@"spaceship%02d", i];
SKTexture *texture = [spaceshipTextureAtlas textureNamed:filename];
[textureArray addObject:texture];
}
SKAction *animationAction = [SKAction animateWithTextures:textureArray timePerFrame:0.1];
[hull runAction:[SKAction repeatActionForever:animationAction]];