2016-10-21 12 views
1

UIBezierPath에서 열린 원을 만들고이를 나중에 SKSpriteNode로 바뀔 SKShapeNode로 변환하려고합니다.SKSpriteNode 프레임 웨이 off

필자는 스프라이트를 줄이는 방법을 찾지 못했지만 선폭이 줄어들지 않는 문제가있었습니다.

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에 대한 올바른 프레임을 설정하는 방법이 있습니까? 내가 어떻게이 일을 할 수 있는지에 대한 다른 생각?

- 편집 - 나는 깜빡합니다. 그림의 빨간색 부분은 SKShapeNode의 프레임을 표시하는 디버그입니다. setup() func에서 어떻게 생성되었는지 볼 수 있습니다. 그러나 프레임에서 얼마나 멀리 떨어져 있는지 보여주기 위해 포함 시켰습니다.

+0

그래서 흰색 호가 원하는 것보다 작습니까? – Confused

+0

호 크기가 문제가되지 않습니다. 호를 축척 할 때 프레임이 꺼져 있기 때문에 올바른 크기로 축척되지 않습니다. 스케일 계산은 내가 나타낸 클래스의 scaleFrom 함수의 코드에 표시됩니다. 올바른 프레임이 있다면 원하는 위치로 확장됩니다 – Nicholas714

+0

저는 문제를 이해하는 데 엄청난 어려움을 겪고 있습니다. 나는 혼란스러워. 확장 성은 맞지만 위치가 잘못 되었습니까? – Confused

답변

1

나는 당신의 문제가 비트 맵 모서리가 스트로크/아웃 라인 너비의 줄과 주변의 차이점이라고 생각한다.

아마도 시각적으로 가장 잘 묘사되었을 것입니다. 빨간색은 시스템이 스프라이트 크기로 보는 것인데, 노란색은 아마도 당신이 생각하고있는 것입니다. 내가 생각하는 효과/문제를 보여주기 위해 선 너비를 크게 과장했습니다.

enter image description here

+0

나는 그것이 또한 문제라고 생각하지만 어떻게 고칠 수 있습니까? – Nicholas714

+0

에는 여전히이 문제가 있습니다. 어떤 아이디어? – Nicholas714

+1

두 가지 모양을 만듭니다. 하나는 위의 매우 훌륭한 흰색 선입니다. 이것을 포지셔닝과 다른 모든 작업에 사용하십시오. 파란색 선은 매우 얇은 선의 자식입니다. 그것은 당신이 얇은 라인에주는 위치에 따라 움직일 것입니다. – Confused