SKTexture和UIImage的scale属性

是否有任何理由为什么一个SKTexture似乎忽略了通过textureWithImage:构造图像的textureWithImage:

我有一个图像资源可用,“retina_image@2x.png”

当我尝试创build一个纹理,而首先创build一个UIImage:

 UIImage* image = [UIImage imageNamed:@"retina_image"]; SKTexture* texture_image = [SKTexture textureWithImage:image]; NSLog(@"image size %@, scale %f", NSStringFromCGSize(image.size), image.scale); NSLog(@"texture from image, size %@", NSStringFromCGSize(texture_image.size)); 

我得到以下结果:

 image size {50, 50}, scale 2.000000 texture from image, size {100, 100} 

虽然我期望得到

 image size {50, 50}, scale 2.000000 texture from image, size {50, 50} 

由于图像的大小(以点为单位)是50×50
当您直接使用资源构build纹理时,也是如此:

 SKTexture* texture_named = [SKTexture textureWithImageNamed:@"retina_image"]; NSLog(@"texture named, size %@", NSStringFromCGSize(texture_named.size)); 

给出以下输出(如预期):

 texture named, size {50, 50} 

这表明SKTexture在从图像构造时确定其自身的尺寸时会忽略缩放属性,同时在从图像名称构build时正确地考虑缩放比例。
这是预期的行为?

(显然,在我的真实代码中,我创build了UIImage,我想以编程方式使用纹理,而不是通过imageNamed)

编辑:这是SpriteKit(确认)的错误,在iOS8中修复

我也发现了这一点,相信这是一个错误。 不知道苹果如何纠正这个问题,因为它可能会破坏现有的代码。

我的解决方法是读取UIImage的比例,然后将SKSpriteNode的比例设置为1.0 /比例。 您需要为SKSpriteNode的x和y比例执行此操作。

UIImage苹果文档

在运行iOS 4或更高版本的设备上,如果设备的屏幕比例为1.0,则行为相同。 如果屏幕的缩放比例为2.0 ,则此方法首先search具有相同文件名的图像文件, 并附加@ 2x后缀 。 例如,如果文件的名称是button,它首先searchbutton@ 2x。 如果它find一个2倍,它将加载该图像,并将返回的UIImage对象的scale属性设置为2.0。 否则,它加载未修改的文件名并将scale属性设置为1.0。 有关支持具有不同比例因子的图像的更多信息,请参见iOS App Programming Guide。

但根据textureWithImageNamed:

新的纹理对象被初始化为图像文件的名称,然后控件立即返回到您的游戏。 当您的游戏需要时,Sprite Kit加载并准备好纹理数据。

加载纹理数据时,Sprite Kit会在应用程序包中search 具有指定文件名的图像文件 。 如果找不到匹配的图像文件,则Sprite Kit会在存储在应用程序包中的任何纹理地图上search纹理。 如果指定的图像不存在于束中的任何位置,Sprite Kit会创build一个占位符纹理图像。

从上面的textureWithImageNamed:SKTexture不关心缩放与设备(视网膜图像)。

我从字典创build的地图集纹理相同的行为。 在iOS 8.3上

如何强制从字典创buildSKTextureAtlas不修改纹理大小?