私はUIBezierPathからオープンサークルを作成しようとしており、後でSKSpriteNodeに変わるSKShapeNodeに変換しようとしています。SKSpriteNodeフレームウェイオフ
私はSpriteを縮小する方法を見つけられず、その線幅は縮小しませんでした。
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を実装する新しいクラスを作成することになった Resize sprite without shrinking contents
:あなたはここに解決策を見ることができますスクリーンショットでは、白い円は、どこに合わせるべきか(灰色のバーと白い円のパスはお互いにあるはずです)に比べて少しずれていることがわかります。これは、ソリューションに表示されているスケール関数を呼び出した場合にのみ発生します(上記のリンクを参照)。
フレームがすべて台無しになっていると思います。表示されている場合、フレームは非常にオフです(フレームが正確ではないため、テクスチャに変換すると、同じ問題がテクスチャに変換される理由です)
どうしてですか?どうすれば修正できますか?手動でSKShapeNodeの正しいフレームを設定する方法はありますか?どのように私はこれを行うことができますか他のアイデア?
--Edit-- 私は言及するのを忘れました。画像の赤い部分は、SKShapeNodeのフレームを表示するためのデバッグです。 setup()関数でどのように作成されたかを見ることができます。しかし、フレームからどのくらい離れているかを示すためにそれを含めました。
だから、白い弧はあなたが望むよりも小さいですか? – Confused
円弧のサイズは問題ありません。私がアークをスケーリングするとき、フレームがオフであるため、アークを正しいサイズにスケーリングしません。スケール計算は、私が示したクラスのscaleFrom関数のコードに示されています。それが正しいフレームを持っていれば、それは私が望むポジションに拡大するでしょう – Nicholas714
私はあなたの問題を理解するのが非常に困難です。よくわかりません。スケーリングは正しいです...しかし、位置は間違っていますか? – Confused