2016-02-02 3 views
2

У меня есть две дуги, которые образуют круг (SKCropNode), каждый с другим цветом. Я знаю, что могу дать всему кругу circleOfRadius, но мне было интересно, можно ли дать только одну дугу физическому телу, чтобы он соответствовал форме дуги.Как дать физическому телу дуге?

Помогите оценить очень.

+0

посмотреть на 'Init (polygonFromPath:)' для 'SKPhysicsBody' – Knight0fDragon

ответ

2

Возможно, вы захотите избежать использования SKCropNode для создания ваших дуг. Из документации Apple,

Использование отсечения и влияния узлов экономно. Оба они очень мощные, но могут быть дорогими, особенно при вложенных вместе в дереве узлов.

В качестве альтернативы вы можете построить дугообразный основной графический путь, а затем создать узел формы из пути. Затем вы можете создать физическое тело, используя путь CG.

Чтобы построить дугообразный путь,

  1. Добавить внутреннюю дугу от начального угла до конечного угла
  2. Добавить линию от конечной точки внутренней дуги к конечной точке внешней дуги
  3. Добавить внешнюю дугу от конечного угла до угла старта
  4. Закрыть путь (который соединяет дуги отправные точки)

Расширение 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) 
+0

Извиняюсь за глупый вопрос, но где вы добавляете расширение CGPath в проект SK, чтобы он работал? – Confused

+0

Вы можете добавить его в свой ViewController (ниже оператора импорта SpriteKit) или в новый файл под названием «Extensions.swift». Он не может быть внутри определения класса или структуры. – 0x141E

+0

Спасибо! Я был (очень медленно), понимая, что расширения удивительны. – Confused

Смежные вопросы