首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在运行时创建SpriteKit纹理地图集吗?

可以在运行时创建SpriteKit纹理地图集吗?
EN

Stack Overflow用户
提问于 2015-06-25 06:11:17
回答 2查看 573关注 0票数 3

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

所以每个字母都有SKNode.SKLabelNode.如果不使用SKLabelNode,抽签计数在6-8之间。通过使用SKLabelNode,他们可以达到现场儿童的数量,几乎可以达到100个。

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

我现在的想法是对这些SKNode-Subclasses进行栅格化,并将纹理放入纹理地图集。

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

也许有一个“最好的方法”来处理很多不同的SKLabelNodes!?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-25 12:20:30

我会选择一个字母类,它是SKSpriteNode的子类,还有一个叫做字母的地图集。这样,你就可以在一次抽签中画出所有的字母(在这种情况下,100张抽签是不必要的)。或者您甚至不需要创建一个SKSpriteNode...You子类就可以这样做:

代码语言:javascript
复制
 SKSpriteNode *letterSprite = [SKSpriteNode spriteNodeWithTexture:[atlas textureNamed:[NSString stringWithFormat:@"%@",character]]];

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

下面是我的TextNode的一个例子,它解析给定的字符串(在我的例子中是数字),并创建单次传递(而不是对每个数字使用SKLabelNode )的every。地图集中的图像应该命名为a@2x.png、b@2x.png,或者如果使用数字1@2x.png、2@2x.png等。

代码语言:javascript
复制
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

希望这有帮助,并将给你基本的想法,如何绘制所有的字母在一次抽签。注意我是如何给字母着色的。在纹理地图集中,图像是白色的,但我很容易将它们着色到想要的颜色。

票数 0
EN

Stack Overflow用户

发布于 2015-06-25 12:45:41

只要你的FPS是好的,不要担心其他任何事情。另外,请记住,Xcode自动在运行时创建纹理地图集,所以这不是您自己必须做的事情。

您可以设置skView.ignoresSiblingOrder = YES;以提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31042493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档