В моем проекте текстуры генерируются процедурно методом, предоставляемым PaintCode (код-краски).
Затем я создаю SKTextureAtlas
из словаря, созданного с помощью UIImage
, сгенерированного этими методами:myAtlas = SKTextureAtlas(dictionary: myTextures)
Наконец, текстуры извлекаются из атласа с использованием textureNamed
:
var sprite1 = SKSpriteNode(texture:myAtlas.textureNamed("texture1"))
Но отображаемые узлы на симуляторе iPhone4S имеют двойной размер. И тройной размер на симуляторе iPhone 6 Plus.
Кажется, что при инициализации atlas вычисляет изображения с разрешением устройства. Но сгенерированные изображения уже имеют правильный размер и не нуждаются в изменении. См. раздел Метод рисования ниже.
Вот описание сгенерированного изображения:<UIImage: 0x7f86cae56cd0>, {52, 52}
И описание соответствующей текстуры в атласе:<SKTexture> 'image1' (156 x 156)
Это для iPhone 6 Plus с использованием изображений @3x, поэтому размер x3.
А для iPhone 4S с использованием изображений @2x, как и ожидалось:<UIImage: 0x7d55dde0>, {52, 52}
<SKTexture> 'image1' (156 x 156)
Наконец, scale
property для сгенерированного UIImage
установлено правильное разрешение устройства: 2.0 для @2x (iPhone 4S) и 3.0 для @3x (iPhone 6 Plus).
Вопрос
Итак, что я могу сделать, чтобы избежать изменения размера изображений в атласе?
Метод рисования
PaintCode генерирует следующие методы рисования:
public class func imageOfCell(#frame: CGRect) -> UIImage {
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
StyleKit.drawCell(frame: frame)
let imageOfCell = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return imageOfCell
}
Обновление 1
Сравнение двух подходов к созданию SKTextureAtlas
// Some test image
let testImage:UIImage...
// Atlas creation
var myTextures = [String:UIImage]()
myTextures["texture1"] = testImage
myAtlas = SKTextureAtlas(dictionary: myTextures)
// Create two textures from the same image
let texture1 = myAtlas.textureNamed("texture1")
let texture2 = SKTexture(image:testImage)
// Wrong display : node is oversized
var sprite1 = SKSpriteNode(texture:texture1)
// Correct display
var sprite2 = SKSpriteNode(texture:texture2)
Кажется, что проблема заключается в SKTextureAtlas
из словаря, так как инициализация SKSpriteNode
не использует свойство scale из UIImage
для правильного размера узла.
Вот описания на консоли: - текстура1: '' (84 x 84) - текстура2: 'текстура1' (84 x 84)
texture2
скучаю по data
! Это может объяснить отсутствие информации об масштабе для правильного определения размера узла:
размер узла = размер текстуры разделить на масштаб текстуры.
Обновление 2
Проблема возникает, когда свойство масштаба UIImage
отличается от единицы.
Таким образом, вы можете использовать следующий метод для создания изображения:
func imageOfCell(frame: CGRect, color:SKColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
var bezierPath = UIBezierPath(rect: frame)
color.setFill()
bezierPath.fill()
let imageOfCell = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return imageOfCell
}