Возможно, вы захотите избежать использования SKCropNode
для создания ваших дуг. Из документации Apple,
Использование отсечения и влияния узлов экономно. Оба они очень мощные, но могут быть дорогими, особенно при вложенных вместе в дереве узлов.
В качестве альтернативы вы можете построить дугообразный основной графический путь, а затем создать узел формы из пути. Затем вы можете создать физическое тело, используя путь CG.
Чтобы построить дугообразный путь,
- Добавить внутреннюю дугу от начального угла до конечного угла
- Добавить линию от конечной точки внутренней дуги к конечной точке внешней дуги
- Добавить внешнюю дугу от конечного угла до угла старта
- Закрыть путь (который соединяет дуги отправные точки)
Расширение CGPath
для создания пути дуги не требуется, но часто его удобнее использовать. После расширения новый метод класса может быть вызван из любого места вашего кода. Вот пример:
extension CGPath {
static func arcWithWidth(arcWidth:CGFloat, start:CGFloat, end:CGFloat, radius:CGFloat, clockwise:Bool) -> CGPath {
// The radius parameter specifies the middle of the arc; adjust this as needed
let innerRadius:CGFloat = radius - arcWidth/2.0
let outerRadius:CGFloat = radius + arcWidth/2.0
// Note the arc is upside down because CGPath uses UIKit coordinates
let path = UIBezierPath()
// Add inner ring.
path.addArcWithCenter(CGPointZero, radius: innerRadius, startAngle: start, endAngle: end, clockwise: clockwise)
let x = outerRadius * cos(end)
let y = outerRadius * sin(end)
// Connect the inner to the outer ring
path.addLineToPoint(CGPointMake(x, y))
// Add outer ring
path.addArcWithCenter(CGPointZero, radius: outerRadius, startAngle: end, endAngle: start, clockwise: !clockwise)
path.closePath()
return path.CGPath
}
}
С расширением, вы можете создать верхние и нижние дуги:
// Top arc
var path = CGPath.arcWithWidth(20, start:0, end: CGFloat(M_PI), radius: 100, clockwise: true)
let topArc = SKShapeNode(path: path)
topArc.position = view.center
topArc.fillColor = SKColor.redColor()
topArc.strokeColor = SKColor.clearColor()
// Add a physics body to the top half
topArc.physicsBody = SKPhysicsBody(polygonFromPath: path)
topArc.physicsBody?.affectedByGravity = false
addChild(topArc)
// Bottom arc
path = CGPath.arcWithWidth(20, start:0, end: CGFloat(M_PI), radius: 100, clockwise: false)
let bottomArc = SKShapeNode(path: path)
bottomArc.position = view.center
bottomArc.fillColor = SKColor.blueColor()
bottomArc.strokeColor = SKColor.clearColor()
addChild(bottomArc)
посмотреть на 'Init (polygonFromPath:)' для 'SKPhysicsBody' – Knight0fDragon