Ios SKSpriteNode框架远离
我试图从UIBezierPath创建一个开放圆,并将其转换为SKShapeNode,稍后将其转换为SKSpriteNode 我遇到了一个问题,当雪碧的线宽没有缩小时,我不知道如何缩小雪碧。您可以在此处看到解决方案: 我最终解决了一些问题并创建了一个新类来实现具有以下功能的自定义SKShapeNode:Ios SKSpriteNode框架远离,ios,swift,uibezierpath,skspritenode,skshapenode,Ios,Swift,Uibezierpath,Skspritenode,Skshapenode,我试图从UIBezierPath创建一个开放圆,并将其转换为SKShapeNode,稍后将其转换为SKSpriteNode 我遇到了一个问题,当雪碧的线宽没有缩小时,我不知道如何缩小雪碧。您可以在此处看到解决方案: 我最终解决了一些问题并创建了一个新类来实现具有以下功能的自定义SKShapeNode: class ShrinkableShape: SKShapeNode { let level: Int let bezierPath: UIBezierPath let scale: CGFl
class ShrinkableShape: SKShapeNode {
let level: Int
let bezierPath: UIBezierPath
let scale: CGFloat
let finalLineWidth: CGFloat
let from: SKSpriteNode
let initialLineWidth = CGFloat(20)
let duration = 0.3
// level would be from 1 to 5 (it is in a for loop)
init(level: Int, from: SKSpriteNode) {
self.level = level
self.from = from
// create the open circle which is (43 * level) + 140
bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: CGFloat(((43 * level) + 140)), startAngle: CGFloat(GLKMathDegreesToRadians(-50)), endAngle: CGFloat(M_PI * 2), clockwise: false)
// calls static function in this class so it is more readable
scale = ShrinkableShape.scaleFrom(level: level) / ShrinkableShape.scaleFrom(level: level + 1)
finalLineWidth = (initialLineWidth / scale)
// inits shape and then sets it up to specific values
super.init()
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup() {
// set sprite to path, set color, set line width and rotate it
self.path = bezierPath.cgPath
self.strokeColor = UIColor(red:0.98, green:0.99, blue:0.99, alpha:1.00)
self.lineWidth = 20
self.position = from.position
// FOR DEBUG: you will see what this makes in the screenshot
let color = SKShapeNode(rect: self.frame)
color.fillColor = UIColor.red
color.alpha = 0.2
color.position = self.position
self.addChild(color)
}
// Makes the radius from the value given (only 1...5) 183, 226, 269, etc
static func scaleFrom(level: Int) -> CGFloat {
return (CGFloat((level * 43) + 140) * 2.0)
}
}
如果您查看屏幕截图,您会注意到白色圆圈与它应该对齐的位置相比有点不一致(灰色条和白色圆圈路径应该相互对齐)。仅当我调用解决方案中显示的比例函数时才会发生这种情况(如上链接)
我想这是因为画面被弄乱了。如果您看到的话,帧是非常不精确的(同样的问题是过去在转换到纹理时出现问题的原因,因为帧并不像它应该的那样精确)
为什么会发生这种情况?我怎么修理它?我有没有办法手动设置SKShapeNode的正确帧?关于如何做到这一点,还有其他想法吗
--编辑--
我忘了提。图中的红色部分是用于查看SKShapeNode框架的调试。您可以在setup()函数中看到它是如何创建的。但我把它包括进来是为了显示它离画面有多远 我认为部分问题在于线条与位图边缘的位置不同,这是因为这些线条周围的笔划/轮廓宽度不同 也许最好的视觉描述是,红色是系统所看到的精灵大小,而黄色可能是你所想的。我大大夸大了线宽,以显示我正在考虑的效果/问题
所以白色弧比您希望的小?不,弧的大小很好。缩放圆弧时,它们不会缩放到正确的大小,因为帧已关闭。比例计算如I类中函数scaleFrom中的代码所示。如果它有正确的框架,它会扩展到我想要的位置。我很难理解你的问题。我很困惑。缩放是正确的。。。但是位置错了?为什么灰色的线在正确的位置,而白色的线不是?嗯,我说的不对,对不起。所以你知道如何使用sprite.scale(0.5)并且它会向下缩放一半?嗯,我正在尝试使用sprite.scale(x)将其缩放到精确的长度和宽度。为了找到正确的比例,我正在做
(level*43+140)/((level+1)*43)+140
,例如,第一个圆是183x183,第二个圆是226x226。比例是183/226。当你插入sprite.scale(183/226)时,它将精确到我想要的长度和宽度。但问题是,事实并非如此。我之所以不这样想,是因为框架尺寸不合适。例如,它比226x226大。我认为这也是问题所在,但我如何解决它?仍然存在这个问题。有什么想法吗?你造了两个形状。一个是上面非常细的白线。使用此功能进行定位和其他操作。蓝线,让它成为一条非常细的线。然后它将根据你给细线的位置移动。好的,我做了更多的调试。真正的问题源于我的游戏场景的大小。当我创建游戏场景时,我使用GameSecene.sks创建它,由于某些原因,它的尺寸不正确,所以iPhone的尺寸是700 x 400。我删除了该文件并将其设置为ViewController的边界大小。现在一切都很好!我只是需要改变一些尺寸来弥补新的尺寸。