SKTexture и свойство масштаба UIImage


Есть ли какая-либо причина, по которой SKTexture, по-видимому, игнорирует .scale изображения, построенного с помощью textureWithImage:?

У меня есть один доступный ресурс изображений, "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 игнорирует свойство scale при определении собственного размера при построении изображения, в то же время должным образом соблюдая масштаб при построении из imagename.
Является ли это ожидаемым поведением?

(очевидно, в моем реальном коде я создаю UIImage, который хочу использовать в текстуре программно, а не через ImageName)

Edit: это (подтвержденная) ошибка в SpriteKit, исправлена в iOS8

3 10

3 ответа:

Я тоже нашел это и считаю, что это ошибка. Не знаю, как Apple собирается исправить это, поскольку это может сломать существующий код.

Мой обходной путь состоит в том, чтобы прочитать масштаб UIImage и затем установить масштаб SKSpriteNode равным 1.0 / scale. Это необходимо сделать как для X, так и для y масштабов SKSpriteNode.

Из яблок доков UIImage

На устройстве, работающем под управлением iOS 4 или более поздней версии , поведение идентично, если экран устройства имеет масштаб 1,0. Если экран имеет масштаб 2,0 , этот метод сначала ищет файл изображения с тем же именем с суффиксом @2x, добавленным к нему . Например, если имя файла кнопка, он сначала ищет кнопку@2x. если он находит 2x, он загружает это изображение и задает свойство масштаба возвращенный объект UIImage до 2.0. В противном случае он загружает неизмененное имя файла и устанавливает масштабируйте свойство до 1.0. Дополнительную информацию смотрите в руководстве по программированию приложений iOS информация о вспомогательных изображениях с различными масштабными коэффициентами.

Но согласно textureWithImageNamed:.

Новый текстурный объект инициализируется именем файла изображения и тогдаконтроль немедленно возвращается в вашу игру. Набор спрайтов загружается и подготавливает текстурные данные, когда это необходимо ваша игра.

При загрузке текстурных данных Sprite Kit ищет пакет приложений для файл изображения с указанным именем . Если соответствующий файл изображения не удается найти, Sprite Kit ищет текстуру в любой текстуре атласы, хранящиеся в пакете приложений. Если указанное изображение не соответствует существуя в любом месте пакета, Sprite Kit создает текстуру-заполнитель изображение.

Из приведенного выше textureWithImageNamed: и SKTexture не заботится о масштабировании с помощью устройство.(изображение сетчатки).

У меня такое же поведение с текстурами из атласа, созданными из словаря. На iOS 8.3

Как заставить SKTextureAtlas, созданный из словаря, не изменять размер текстур?