3

SKLabelNodeを使用してクロスワード文字をSKNodeサブクラスの子として表示する os x/iOS クロスワード ゲームを開発しています。

したがって、各文字にはSKNode.SKLabelNodeがあります。SKLabelNodeを使用しない場合、描画カウントは 6 ~ 8 の範囲になります。SKLabelNodeを使用すると、シーン内の子の数がほぼ 100 になります。

私は現在、それを回避する方法を探しており、SKLabelNodeをテクスチャにラスタライズするというアイデアを思いつきましたが、まだ多くの異なるテクスチャがあるため、これは描画カウントを下げません。

私のアイデアは、これらのSKNodeサブクラスをラスタライズし、テクスチャをテクスチャ アトラスに入れることです。

質問は、実行時にテクスチャ アトラスを作成することは可能ですか? 単一のテクスチャが変更された場合はどうすればよいですか? アトラスで単一のテクスチャを交換することは可能ですか、それとも再構築する必要がありますか?

そして、多くの異なる SKLabelNodes を処理するための「最良の方法」があるかもしれません!?

4

2 に答える 2

0

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

これが役に立ち、単一の描画パスですべての文字を描画する方法の基本的なアイデアが得られることを願っています. そして、文字に色を付ける方法に注意してください。テクスチャ アトラスの画像は白ですが、簡単に希望の色に色付けします。

于 2015-06-25T12:20:30.693 に答える
0

FPS が良好である限り、他には何も心配する必要はありません。また、Xcode は実行時にテクスチャ アトラスを自動作成するため、自分で行う必要はありません。

skView.ignoresSiblingOrder = YES;パフォーマンスを少し向上させるように設定できます。

于 2015-06-25T12:45:41.057 に答える