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不修改纹理大小?