在通过SKTexture构造图像时,有什么原因使.scale看起来忽略了图像的.scale?
我有一个可用的图像资源,"retina_image@2x.png“
当我在创建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}因为图像的大小(以点为单位)为50x50。
这也是直接使用资源构造纹理时得到的结果:
SKTexture* texture_named = [SKTexture textureWithImageNamed:@"retina_image"];
NSLog(@"texture named, size %@", NSStringFromCGSize(texture_named.size));提供以下输出(如预期的那样):
texture named, size {50, 50}这表明,SKTexture在构造图像时,在确定自己的大小时,忽略了刻度属性,而在从imagename构造标度时则适当地尊重该比例。
这是预期的行为吗?
(显然,在我的实际代码中,我创建了我希望以编程方式而不是通过UIImage在纹理中使用的imageNamed)。
编辑:这是SpriteKit中的一个(已确认的)错误,在iOS8中修复
发布于 2014-03-18 11:15:12
我也发现了这个,我相信这是个虫子。不确定苹果将如何纠正这一点,因为它可能会破坏现有的代码。
我的解决方法是读取UIImage的刻度,然后将SKSpriteNode的比例设置为1.0 / scale。对于SKSpriteNode的x和y尺度,您都需要这样做。
发布于 2014-01-07 10:46:49
来自UIImage的苹果
在运行iOS 4或更高版本的的设备上,如果设备的屏幕标度为1.0,则行为是相同的。如果屏幕的比例尺为2.0,则该方法首先在中搜索具有的图像文件,该文件名与后缀为@2x。例如,如果文件名为按钮,它首先搜索按钮@2x。如果找到2x,则加载该映像,并将返回的UIImage对象的scale属性设置为2.0。否则,它将加载未修改的文件名,并将scale属性设置为1.0。有关支持具有不同比例因素的图像的更多信息,请参见iOS应用程序编程指南。
但根据textureWithImageNamed:的说法。
新的纹理对象是初始化的和图像文件的名称,然后控件立即返回到您的游戏。雪碧套件加载和准备纹理数据时,它是需要你的游戏。 当加载纹理数据时,Sprite Kit 在应用程序包中搜索具有指定文件名的图像文件。如果找不到匹配的图像文件,Sprite Kit将在应用程序包中存储的任何纹理地图集中搜索纹理。如果指定的图像在包中的任何地方都不存在,Sprite Kit将创建占位符纹理图像。
根据以上所述,textureWithImageNamed:和SKTexture并不关心设备的缩放。(视网膜图像)
发布于 2015-07-22 08:19:16
我也有同样的行为,纹理从地图集创建的字典。关于iOS 8.3
How to force SKTextureAtlas created from a dictionary to not modify textures size?
https://stackoverflow.com/questions/20969392
复制相似问题