私のプロジェクトでは、テクスチャはPaintCode ( paint-code )によって提供されるメソッドから手続き的に生成されます。
次に、これらのメソッドによって生成されSKTextureAtlas
た辞書ファイルから を作成します。UIImage
myAtlas = SKTextureAtlas(dictionary: myTextures)
最後に、次を使用してアトラスからテクスチャを取得します。
textureNamed
var sprite1 = SKSpriteNode(texture:myAtlas.textureNamed("texture1"))
ただし、iPhone4S シミュレーターでは表示されるノードのサイズが 2 倍になります。そして、iPhone 6 Plus シミュレーターでは 3 倍の大きさになります。
初期化時に、アトラスはデバイスの解像度で画像を計算しているようです。ただし、生成された画像は既に正しいサイズになっているため、変更する必要はありません。以下の描画方法を参照してください。
生成された画像の説明は次のとおりです。
<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
generated のプロパティUIImage
が適切なデバイス解像度に設定されます: @2x (iPhone 4S) の場合は 2.0、@3x (iPhone 6 Plus) の場合は 3.0 です。
質問
では、アトラスが写真のサイズを変更しないようにするにはどうすればよいですか?
描画方法
PaintCode は、次のような描画メソッドを生成します。
public class func imageOfCell(#frame: CGRect) -> UIImage {
UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
StyleKit.drawCell(frame: frame)
let imageOfCell = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return imageOfCell
}
更新 1
生成する 2 つのアプローチの比較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)
初期化ではノードのサイズを正しく設定するためにscaleプロパティを使用しないため、問題はSKTextureAtlas
辞書にあるようです。SKSpriteNode
UIImage
コンソールでの説明は次のとおりです: - texture1: '' (84 x 84) - texture2: 'texture1' (84 x 84)
texture2
一部を欠場data
!これは、次のようにノードを適切にサイズ設定するためのスケール情報が不足していることを説明できます。
ノードのサイズ = テクスチャのサイズをテクスチャのスケールで割ります。
更新 2
この問題は、のスケール プロパティがUIImage
1 と異なる場合に発生します。
したがって、次の方法を使用して画像を生成できます。
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
}