gpt4 book ai didi

swift - 如何强制从字典创建的 SKTextureAtlas 不修改纹理大小?

转载 作者:行者123 更新时间:2023-11-28 07:03:03 28 4
gpt4 key购买 nike

在我的项目中,纹理 是通过 PaintCode ( ) 提供的方法按程序生成的。

然后我创建一个 SKTextureAtlas来自字典 UIImage通过这些方法生成:
myAtlas = SKTextureAtlas(dictionary: myTextures)

最后,使用 textureNamedatlas 检索纹理 :
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生成的属性 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

比较两种生成 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初始化不使用 UIImage 中的 scale 属性正确调整节点大小。

这里是控制台的描述:- 纹理 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

}

enter image description here

最佳答案

问题来自于使用 SKTextureAtlas(dictionary:) 来初始化图集。

使用此方法创建的 SKTexture 不会嵌入与图像的 scale 属性相关的数据。因此,在 init(texture:) 创建 SKSpriteNode 期间,纹理中缺少比例信息导致选择纹理大小而不是图像大小。

纠正它的一种方法是在 SKSpriteNode 创建期间提供节点的大小:init(texture:size:)

关于swift - 如何强制从字典创建的 SKTextureAtlas 不修改纹理大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557305/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com