2

私のプロジェクトでは、テクスチャはPaintCode ( )によって提供されるメソッドから手続き的に生成されます。

次に、これらのメソッドによって生成され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)

最後に、scalegenerated のプロパティ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辞書にあるようです。SKSpriteNodeUIImage

コンソールでの説明は次のとおりです: - texture1: '' (84 x 84) - texture2: 'texture1' (84 x 84)

texture2一部を欠場dataこれは、次のようにノードを適切にサイズ設定するためのスケール情報が不足していることを説明できます。

ノードのサイズ = テクスチャのサイズをテクスチャのスケールで割ります。

更新 2

この問題は、のスケール プロパティがUIImage1 と異なる場合に発生します。

したがって、次の方法を使用して画像を生成できます。

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

    }

ここに画像の説明を入力

4

2 に答える 2

2

問題は、SKTextureAtlas(dictionary:)アトラスを初期化するために を使用することにあります。

このメソッドを使用して作成された SKTexture は、画像のスケールプロパティに関連するデータを埋め込みません。SKSpriteNodeそのため、テクスチャのスケール情報が不足しているため、作成中init(texture:)に画像のサイズの代わりにテクスチャのサイズを選択することになります。

SKSpriteNodeこれを修正する 1 つの方法は、作成時にノードのサイズを指定することです。init(texture:size:)

于 2015-07-22T17:25:31.393 に答える