SKSpriteNode 多个纹理
Posted
技术标签:
【中文标题】SKSpriteNode 多个纹理【英文标题】:SKSpriteNode multiple textures 【发布时间】:2014-02-08 11:14:44 【问题描述】:让SKSpriteNode
由多张图片组成的最佳方式是什么?
我发现 [SKTexture textureWithImage:image];
不使用 scale 属性(当我将它与自定义位图组合图像一起使用时,我有一个小的 SKSpriteNode
)。
也许我可以在多个 SKSpriteNode
之间创建一个链接,但我不确定这对于碰撞检测是否是个好主意。
编辑:
适合我的解决方案。
此代码采用 3 个纹理,将它们绘制在创建 UIImage
的 GraphicsContext
中。
然后我将这个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 纹理