2

我正在从 a 创建一个精灵SKTexture,而它又是从从图集加载的另一个纹理创建的,如下所示:

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@“MyImage.png”];
CGRect myRect = textureFromAtlas.textureRect;
myRect.size.with *= 0.5;
myRect.size.height *= 0.5;
SKTexture *newTexture = [SKTexture textureWithRect:myRect inTexture:textureFromAtlas];
SKSpriteNode * MySprite = [SKSpriteNode spriteNodeWithTexture:newTexture];

textureFromAtlas碰巧被旋转了,因为在应用程序包中的文件夹Images.atlasc中, Images.1.png显示MyImage.png已旋转,并且Images.plist的关键textureRotated为该子图像设置为 YES

如何创建MySprite以使其具有正确的旋转?

在此处输入图像描述

(A)是人们所期望的,因为 SpriteKit 做了自动旋转的事情; (B)是实际结果,即从上面的代码得到什么

编辑:

我不得不添加一些代码来获取MyImage.png的大小,但是图集中包含旋转的,看它是否旋转,然后计算一个新的旋转myRect用于mySrpite

CGRect textureRect = textureFromAtlas.textureRect;
CGSize atlasSize = [[SKTexture textureWithRect:CGRectMake(0, 0, 1, 1)
                                     inTexture:textureFromAtlas] size];
CGSize sizeInAtlas = CGSizeMake(textureRect.size.width * atlasSize.width,
                                textureRect.size.height * atlasSize.height);
myRect = CGRectMake(myRect.origin.x,
                    myRect.origin.y+myRect.size.height-sizeInAtlas.height/atlasSize.height);
SKTexture *rotatedTexture = [SKTexture textureWithRect:myRect
                                             inTexture:textureFromAtlas];
mySprite = [SKSpriteNode spriteWithTexture: rotatedTexture];
mySprite.zRotation = M_PI_2;

这有效地将矩形“移动”到Image.1.png中旋转图像的左上角,因此这mySprite将是(A)中的那个,但是这只适用于 MyImage.png 完全不透明或没有透明边框,因为 SpriteKit 对那些具有透明度的图像做了一些优化,并且 textureRect 比图集中的实际帧小。

4

1 回答 1

3

不幸的是,当使用来自 SKTextureAtlas 的纹理时,textureWithRect:inTexture 似乎存在错误。这是有道理的,因为您要做的是从 sprite map 创建 sprite map,我可以看到这会导致一些性能问题。

为了获得您想要的结果,我看到它以两种不同的方式工作。

第一个选项将 MyImage 移出 atlas 文件夹(或使用资产类别)并使用 textureWithRect:inTexture。如果图像已经创建为精灵表并且您不想将其切碎,这是理想的选择。这不是一个糟糕的解决方案,但您可能会使用第二种选择获得更好的结果。

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@“MyImage.png”];
CGRect myRect = CGRectMake(0,.5,.5,.5);
SKTexture *newTexture = [SKTexture textureWithRect:myRect inTexture:textureFromAtlas];
SKSpriteNode * MySprite = [SKSpriteNode spriteNodeWithTexture:newTexture];

第二个选项切掉你的图像,然后将这些图像添加到 images.atlas 如果你想在一张精灵表(图集)上获得可能同时渲染的其他纹理,这是更理想的选择。SpriteKit 会在运行时将它们组合成一个图像。

在此处输入图像描述

红色/绿色将是切碎的图像,然后组合在一起,而粉红色/绿色只是您以前拥有的一个图像。

然后,您将能够轻松地使用诸如...之类的代码

SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@"MyImage1.png"];
SKSpriteNode *mySprite = [SKSpriteNode spriteNodeWithTexture:textureFromAtlas];

这两种选择都不需要担心旋转。即使 .atlas 在您取出图像时旋转它,它也不会旋转。

于 2015-03-08T05:25:28.253 回答