2016-10-21 7 views
1

私は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) 
} 

}

enter image description here あなたが見れば:私はいくつかのものを固定し、この機能を持つカスタムSKShapeNodeを実装する新しいクラスを作成することになった Resize sprite without shrinking contents

:あなたはここに解決策を見ることができますスクリーンショットでは、白​​い円は、どこに合わせるべきか(灰色のバーと白い円のパスはお互いにあるはずです)に比べて少しずれていることがわかります。これは、ソリューションに表示されているスケール関数を呼び出した場合にのみ発生します(上記のリンクを参照)。

フレームがすべて台無しになっていると思います。表示されている場合、フレームは非常にオフです(フレームが正確ではないため、テクスチャに変換すると、同じ問題がテクスチャに変換される理由です)

どうしてですか?どうすれば修正できますか?手動でSKShapeNodeの正しいフレームを設定する方法はありますか?どのように私はこれを行うことができますか他のアイデア?

--Edit-- 私は言及するのを忘れました。画像の赤い部分は、SKShapeNodeのフレームを表示するためのデバッグです。 setup()関数でどのように作成されたかを見ることができます。しかし、フレームからどのくらい離れているかを示すためにそれを含めました。

+0

だから、白い弧はあなたが望むよりも小さいですか? – Confused

+0

円弧のサイズは問題ありません。私がアークをスケーリングするとき、フレームがオフであるため、アークを正しいサイズにスケーリングしません。スケール計算は、私が示したクラスのscaleFrom関数のコードに示されています。それが正しいフレームを持っていれば、それは私が望むポジションに拡大するでしょう – Nicholas714

+0

私はあなたの問題を理解するのが非常に困難です。よくわかりません。スケーリングは正しいです...しかし、位置は間違っていますか? – Confused

答えて

1

私はあなたの問題の一部は、あなたの行を持っている場所と、ビットマップの辺がストローク/輪郭幅の結果である場所の違いだと思います。

おそらく、視覚的に最もよく記述されています。レッドは、システムがスプライトサイズと見なすものですが、黄色はおそらくあなたが考えているものです。私は、私が考えている効果/問題を示すために線幅を大きく誇張しました。

enter image description here

+0

それも問題だと思いますが、どうすれば修正できますか? – Nicholas714

+0

にはまだこの問題があります。何か案は? – Nicholas714

+1

2つの図形を作成します。 1つは上の非常に細かい白い線です。これはポジショニングやその他すべての作業に使用します。青い線は、それを非常に細い線の子にします。あなたが細い線に与えた位置に従って移動します。 – Confused

関連する問題