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

标签 ios sprite-kit sknode sklabelnode sktextureatlas

我正在开发一个 os x/iOS 填字游戏,它使用 SKLabelNodeSKNode 子类上将填字游戏字母显示为子类。

因此对于每个字母都有 SKNode.SKLabelNode。在不使用 SKLabelNode 的情况下,绘制计数在 6-8 的范围内。通过使用 SKLabelNode,他们增加了场景中的 child 数量,几乎可以达到 100 个。

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

我现在的想法是光栅化这些 SKNode-Subclasses 并将纹理放入纹理图集。

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

也许有一种“最佳方式”来处理大量不同的 SKLabelNodes!?

最佳答案

我会选择一个 letter 类,它是 SKSpriteNode 的子类和一个名为 letters 的图集。这样,您将在单次绘制过程中绘制所有字母(在这种情况下不需要 100 次绘制过程)。或者你甚至不必创建 SKSpriteNode 的子类......你可以这样做:

 SKSpriteNode *letterSprite = [SKSpriteNode spriteNodeWithTexture:[atlas textureNamed:[NSString stringWithFormat:@"%@",character]]];

这种方法的局限性在于字母具有预先确定的大小。我怀疑您的填字游戏中是否需要不同大小的字母。如果你需要改变字母的大小,你仍然可以缩放它们,但我猜理论上会因为缩放位图而导致一些质量损失。我说理论上是因为在大多数情况下质量损失并不明显。

这是我的 TextNode 的一个示例,它解析给定的字符串(在我的例子中是数字)并创建单次绘制的 Sprite (而不是对每个数字都使用 SKLabelNode)。 map 集中的图像应命名为 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

希望这对您有所帮助,并让您了解如何在单次绘制过程中绘制所有字母的基本概念。并注意我如何给字母上色。在纹理图集中,图像是白色的,但我很容易将它们着色为所需的颜色。

关于ios - 我可以在运行时创建 SpriteKit 纹理图集吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31042493/

相关文章:

ios - 从 SceneDelegate 更新屏幕结构的状态

ios - 在 Spritekit 中使用图像作为图 block 集

ios - SpriteKit : detect complete node overlap

ios - SpriteKit : how to add/remove node and avoid having mutation exception while enumerating?

ios - 如何获得 Sprite 相对于世界坐标的 zRotation?

ios - 为什么我的函数在 Swift 中无法正确自动完成?

ios - 导航 Controller 为空

iPhone Swift 改变你的初始场景

ios - 如何通过平移手势限制可移动 View

swift - float SpriteKit