我正在开发一个os x / iOS填字游戏,该游戏使用 SKLabelNode 在 SKNode 子类中将填字游戏字母显示为子项。
因此,每个字母都有 SKNode.SKLabelNode 。不使用 SKLabelNode ,抽奖计数在6-8的范围内。使用 SKLabelNode ,它们可以达到场景中可能接近100的儿童数量。
我现在正在寻找一种避免这种情况的方法,并提出将 SKLabelNode 栅格化为纹理的想法,但这并没有降低绘制计数,因为仍有许多不同的纹理。
我的想法是光栅化这些 SKNode - 子类,并将纹理放入纹理图集。
所以问题是,是否可以在运行时创建纹理图集?如果单个纹理发生变化该怎么办?是否有可能在地图册中交换单个纹理,或者我必须重建它?
也许有一种最好的方式"处理很多不同的SKLabelNodes!?
答案 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;
以提高您的表现。