SKSpriteNode のサブクラスである文字クラスと文字と呼ばれるアトラスを使用します。そうすれば、すべての文字を 1 回の描画パスで描画できます (この状況では 100 回の描画パスは不要です)。または、SKSpriteNode のサブクラスを作成する必要さえありません...これを行うことができます:
SKSpriteNode *letterSprite = [SKSpriteNode spriteNodeWithTexture:[atlas textureNamed:[NSString stringWithFormat:@"%@",character]]];
このアプローチの制限は、文字のサイズがあらかじめ決められていることです。クロスワード ゲームで異なるサイズの文字が必要になるとは思えません。文字のサイズを変更する必要がある場合は、引き続きスケーリングできますが、理論的には、ビットマップのスケーリングのために品質の低下が発生すると思います。ほとんどの場合、品質の低下は目立たないため、理論的に言います。
これは、指定された文字列 (私の場合は数値) を解析し、単一のパスで描画されるスプライトを作成する TextNode の例です (単一の数値ごとに SKLabelNode を使用するのではなく)。アトラスの画像は、a@2x.png、b@2x.png のように名前を付ける必要があります。数字を使用する場合は、1@2x.png、2@2x.png などです。
static const float kCharacterDistance = 6.0f;
#import "TextNode.h"
@interface TextNode()
@property (nonatomic,strong) NSMutableArray* characters;
@end
@implementation TextNode
-(instancetype)initWithPosition:(CGPoint)position andText:(NSString*)text{
if(self =[super init]){
self.characters = [[NSMutableArray alloc] initWithCapacity:[text length]];
SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"numbers"];
for(NSUInteger i =0; i < [text length];i++){
NSString *character = [text substringWithRange:NSMakeRange(i, 1)];
SKSpriteNode *characterSprite = [SKSpriteNode spriteNodeWithTexture:[atlas textureNamed:[NSString stringWithFormat:@"%@",character]]];
characterSprite.color = [SKColor yellowColor];
characterSprite.colorBlendFactor = 1.0f;
characterSprite.position = CGPointMake(i*kCharacterDistance,0);
[self.characters addObject:characterSprite];
[self addChild:characterSprite];
}
self.position = position;
}
return self;
}
@end
これが役に立ち、単一の描画パスですべての文字を描画する方法の基本的なアイデアが得られることを願っています. そして、文字に色を付ける方法に注意してください。テクスチャ アトラスの画像は白ですが、簡単に希望の色に色付けします。