我正在创建一个来自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 具有键< strong> 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;
这有效地&#34;移动&#34; Image.1.png 中旋转图像的左上角的矩形,以便mySprite
成为中的一个(A ),但这仅在MyImage.png完全不透明或没有透明边框时才有效,因为SpriteKit会对那些具有透明度的图像进行一些优化,并且textureRect小于图集中的实际帧。
答案 0 :(得分:3)
不幸的是,当使用来自SKTextureAtlas的纹理时,textureWithRect:inTexture似乎存在错误。这样有意义,因为你要做的是从精灵地图创建一个精灵地图,我可以看到这会导致一些性能问题。
为了得到你想要的结果,我看到它有两种不同的方式。
第一个选项将MyImage移出atlas文件夹(或使用asset catelog)并使用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如果你想获得可以在一个精灵表(atlas)上同时渲染的其他纹理,这是更理想的选择。 SpriteKit将在运行时将它们组合成一个图像。
红色/绿色将是切碎的图像,然后合并,粉红色/绿色只是您之前的一个图像。
然后您就可以轻松使用像......这样的代码。
SKTexture *textureFromAtlas = [SKTexture textureWithImageNamed:@"MyImage1.png"];
SKSpriteNode *mySprite = [SKSpriteNode spriteNodeWithTexture:textureFromAtlas];
这两个选项都不需要担心轮换。即使.atlas在你拿出图像时旋转它也不会旋转。