我可以在运行时创建SpriteKit纹理图集

时间:2015-06-25 06:11:17

标签: ios sprite-kit sknode sklabelnode sktextureatlas

我正在开发一个os x / iOS填字游戏,该游戏使用 SKLabelNode SKNode 子类中将填字游戏字母显示为子项。

因此,每个字母都有 SKNode.SKLabelNode 。不使用 SKLabelNode ,抽奖计数在6-8的范围内。使用 SKLabelNode ,它们可以达到场景中可能接近100的儿童数量。

我现在正在寻找一种避免这种情况的方法,并提出将 SKLabelNode 栅格化为纹理的想法,但这并没有降低绘制计数,因为仍有许多不同的纹理。

我的想法是光栅化这些 SKNode - 子类,并将纹理放入纹理图集。

所以问题是,是否可以在运行时创建纹理图集?如果单个纹理发生变化该怎么办?是否有可能在地图册中交换单个纹理,或者我必须重建它?

也许有一种最好的方式"处理很多不同的SKLabelNodes!?

2 个答案:

答案 0 :(得分:0)

我会选择一个字母类,它是SKSpriteNode的子类和一个名为letters的图集。这样,你将在单个绘制过程中绘制所有字母(在这种情况下不需要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

希望这会有所帮助,并且会为您提供如何在单次通过中绘制所有字母的基本概念。并注意我如何着色字母。在纹理图集中,图像是白色的,但我可以轻松地将它们着色为所需的颜色。

答案 1 :(得分:0)

只要您的FPS好,就不要担心其他任何事情。另外,请记住Xcode会在运行时自动创建纹理图集,因此您不必自己创建。

您可以设置skView.ignoresSiblingOrder = YES;以提高您的表现。