SKTexture и свойство масштабирования UIImage
Есть ли причина, по которой SKTexture
появляется, чтобы игнорировать .scale
изображения при построении через textureWithImage:
?
У меня есть один доступный ресурс изображения, "[email protected]"
Когда я сначала пытаюсь создать текстуру при создании 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 при определении его собственного размера при построении формы изображения при правильном соблюдении масштаба при построении из изображения.
Это ожидаемое поведение?
(очевидно, в моем реальном коде я создаю UIImage, который я хочу использовать в текстуре программно, а не через imageNamed)
Изменить: это (подтвержденная) ошибка в SpriteKit, исправленная в iOS8
Ответы
Ответ 1
Я тоже нашел это и считаю, что это ошибка. Не уверен, как Apple собирается исправить это, поскольку это может сломать существующий код.
Мое обходное решение - прочитать шкалу UIImage, а затем установить масштаб SKSpriteNode 1.0/scale. Это нужно сделать как для x и y шкал SKSpriteNode.
Ответ 2
Из apples doc UIImage
На устройстве под управлением iOS 4 или более поздней версии поведение идентично, если экран устройств имеет масштаб 1,0. Если экран имеет масштаб 2.0, этот метод сначала выполняет поиск для файла изображения с тем же именем файла с добавленным к нему суффиксом @2x. Например, если имя файла, он сначала ищет кнопку @2x. Если он находит 2x, он загружает это изображение и задает свойство scale возвращаемого объекта UIImage до 2.0. В противном случае он загружает немодифицированное имя файла и устанавливает scale до 1.0. См. Руководство по программированию приложений для iOS для получения дополнительной информации. информация о поддержке изображений с различными масштабными коэффициентами.
Но согласно textureWithImageNamed:
.
Новый объект текстуры инициализирован с именем файла изображения а затем контроль немедленно возвращается в вашу игру. Комплект поставки Sprite и готовит данные текстуры, когда это необходимо вашей игре.
При загрузке данных текстуры Sprite Kit ищет приложение для файл изображения с указанным именем файла. Если соответствующий файл изображения не может быть найден, Sprite Kit ищет текстуру в любой текстуре атласы, хранящиеся в комплекте приложений. Если указанное изображение не существуют в любом месте пакета, Sprite Kit создает текстуру заполнителя изображение.
Из приведенных выше textureWithImageNamed:
и SKTexture
не нужно масштабировать устройство (изображение сетчатки).
Ответ 3
У меня такое же поведение с текстурами из атласа, созданного из словаря.
На iOS 8.3
Как заставить SKTextureAtlas, созданный из словаря, не изменять размер текстур?