SKSpriteNode 多个纹理

Posted

技术标签:

【中文标题】SKSpriteNode 多个纹理【英文标题】:SKSpriteNode multiple textures 【发布时间】:2014-02-08 11:14:44 【问题描述】:

SKSpriteNode由多张图片组成的最佳方式是什么?

我发现 [SKTexture textureWithImage:image]; 不使用 scale 属性(当我将它与自定义位图组合图像一起使用时,我有一个小的 SKSpriteNode)。

也许我可以在多个 SKSpriteNode 之间创建一个链接,但我不确定这对于碰撞检测是否是个好主意。

编辑:

适合我的解决方案。 此代码采用 3 个纹理,将它们绘制在创建 UIImageGraphicsContext 中。 然后我将这个UIImage 添加到我现在有多个纹理的SKNode 中。但是,在我的例子中,指定SKNode size 属性 [self setSize:CGSizeMake(WIDTH_HERO, HEIGHT_HERO)]; 非常重要。如果您不这样做,该节点将使用 错误的比例因子,您将获得较小的纹理(非视网膜)。

CGSize mergedSize = CGSizeMake(WIDTH_HERO, HEIGHT_HERO);
UIGraphicsBeginImageContextWithOptions(mergedSize, NO, 0.0f);

[textureImage1 drawInRect:CGRectMake(0, 0, WIDTH_HERO, textureImage1.size.height)];
[textureImage2 drawInRect:CGRectMake(0, 40, WIDTH_HERO, textureImage2.size.height)];
[textureImage3 drawInRect:CGRectMake(0, 0, WIDTH_HERO, textureImage3.size.height)];

UIImage *mergedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self setTexture:[SKTexture textureWithImage:mergedImage]];

【问题讨论】:

你需要多个精灵,将它们放在同一个 sknode 中,并使用累积帧进行碰撞 真的要使用SKTexture来创建精灵节点吗? 我猜是的。即使你可以在不明确指定纹理的情况下创建一个 SKSpriteNode,它背后也有一个。 【参考方案1】:

您可以使用下一个纹理创建另一个SKSpriteNode,并在原始节点上调用addChild:,然后更改新节点相对于父节点的位置。

这是在我的SKSpriteNode 子类中;

    UIImage* bottom = [[UIImage imageNamed: @"obstacle_base"] resizableImageWithCapInsets: UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage* top = [UIImage imageNamed: @"obstacle_top"];

    SKTexture* bottomT = [SKTexture textureWithImage: bottom];
    SKTexture* topT = [SKTexture textureWithImage: top];

    [self setTexture: bottomT];

    // create top
    SKSpriteNode* topNode = [[SKSpriteNode alloc] initWithTexture: topT];
    topNode.position = CGPointMake(0, height/2 - topNode.size.height/2);
    [self addChild: topNode];

【讨论】:

以上是关于SKSpriteNode 多个纹理的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用纹理数组更改 SKSpriteNode 纹理

SKSpriteNode 纹理 alpha 是不是影响触摸区域?

水平镜像 SKSpriteNode 纹理

无法可靠地验证 SKSpriteNode 的纹理

如何让 SKSpriteNode 不旋转纹理

无法更改SKSpriteNode的纹理