Заполните SKShapeNode, созданный из CGPath

Я пытаюсь создать собственный SKShapeNode на основе массива точек. Точки образуют замкнутую форму, и в конечном итоге фигура должна быть заполнена.

Это то, что я придумал до сих пор, но по какой-то причине штрих рисуется нормально, но форма остается пустой. Что я пропустил?

override func didMoveToView(view: SKView)
{
    let center = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    let path = CGPathCreateMutable()


    CGPathMoveToPoint(path, nil, center.x, center.y)
    CGPathAddLineToPoint(path, nil, center.x + 50, center.y + 50)

    CGPathMoveToPoint(path, nil, center.x + 50, center.y + 50)
    CGPathAddLineToPoint(path, nil, center.x - 50, center.y + 50)

    CGPathMoveToPoint(path, nil, center.x - 50, center.y + 50)
    CGPathAddLineToPoint(path, nil, center.x - 50, center.y - 50)

    CGPathMoveToPoint(path, nil, center.x - 50, center.y - 50)
    CGPathAddLineToPoint(path, nil, center.x, center.y)

    CGPathCloseSubpath(path)

    let shape = SKShapeNode(path: path)
    shape.strokeColor = SKColor.blueColor()
    shape.fillColor = SKColor.redColor()
    self.addChild(shape)
}

person Gerome Pistre    schedule 23.10.2015    source источник


Ответы (2)


Что-то не так с вашим path. Обычно вы вызываете CGPathMoveToPoint, чтобы установить начальную точку пути, после чего следует серия вызовов CGPathAdd*, чтобы добавить сегменты линии к пути. Попробуйте создать его следующим образом:

let path = CGPathCreateMutable()         
CGPathMoveToPoint(path, nil, center.x, center.y)
CGPathAddLineToPoint(path, nil, center.x + 50, center.y + 50)
CGPathAddLineToPoint(path, nil, center.x - 50, center.y + 50)
CGPathAddLineToPoint(path, nil, center.x - 50, center.y - 50)
CGPathCloseSubpath(path)

Прочтите Справочник по CGPath (поиск CGPathMoveToPoint) для получения дополнительных сведений.

person WangYudong    schedule 23.10.2015

Например, вам не нужно использовать CGPath для этого действия, вы можете сделать что-то вроде этого:

let points: [CGPoint] = [CGPointMake(center.x, center.y), ...] // All your points
var context: CGContextRef = UIGraphicsGetCurrentContext()

CGContextAddLines(context, points, UInt(points.count))
CGContextSetFillColorWithColor(context, UIColor.redColor().CGColor)
CGContextFillPath(context)

let shape = SKShapeNode(path: CGContextCopyPath(context))
...
person Alexey Pichukov    schedule 23.10.2015