使用单个SKShapeNode渲染多个重叠多边形?

时间:2017-01-09 16:41:21

标签: ios swift sprite-kit

我发现可以使用单个SKShapeNode对象渲染多个多边形:

class GameScene: SKScene {

    override func didMove(to view: SKView) {
        let polygons = [
            [
                CGPoint(x: 0, y: 0),
                CGPoint(x: 100, y: 100),
                CGPoint(x: 100, y: 0)
            ],
            [
                CGPoint(x: 50, y: 50),
                CGPoint(x: 50, y: 150),
                CGPoint(x: 150, y: 150),
                CGPoint(x: 150, y: 50),
            ],
        ]

        let path = CGMutablePath()

        for points in polygons {
            path.addLines(between: points)
            path.closeSubpath()
        }

        let node = SKShapeNode(path: path)
        node.fillColor = UIColor.red

        addChild(node)
    }
}

但是,多边形重叠的任何空格都会呈现为空:

enter image description here

是否可以填充这些空白区域,同时继续使用单个节点?

1 个答案:

答案 0 :(得分:0)

如果你不关心边界,这是一个重要的解决方法。

class GameScene: SKScene {

    override func didMove(to view: SKView) {
        let polygons = [
            [
                CGPoint(x: 0, y: 0),
                CGPoint(x: 100, y: 100),
                CGPoint(x: 100, y: 0)
            ],
            [
                CGPoint(x: 50, y: 50),
                CGPoint(x: 50, y: 150),
                CGPoint(x: 150, y: 150),
                CGPoint(x: 150, y: 50),

            ]
        ]

        let path = CGMutablePath()

        for points in polygons {
            path.addLines(between: points)
            path.closeSubpath()
        }

        let first = CGMutablePath()
        first.addLines(between: polygons[0]);
        first.closeSubpath()

        let second = CGMutablePath()
        second.addLines(between: polygons[1]);
        second.closeSubpath()

        let node = SKShapeNode(path: first)
        node.fillColor = .red
        node.strokeColor = .red

        let child = SKShapeNode(path: second)
        child.fillColor = .red
        child.strokeColor = .red
        node.addChild(child)


        addChild(node)
    }
}

如果你关心边界,那么......

class GameScene: SKScene {

    override func didMove(to view: SKView) {
        let polygons = [
            [
                CGPoint(x: 0, y: 0),
                CGPoint(x: 100, y: 100),
                CGPoint(x: 100, y: 0)
            ],
            [
                CGPoint(x: 50, y: 50),
                CGPoint(x: 50, y: 150),
                CGPoint(x: 150, y: 150),
                CGPoint(x: 150, y: 50),

            ]
        ]

        let path = CGMutablePath()

        for points in polygons {
            path.addLines(between: points)
            path.closeSubpath()
        }

        let first = CGMutablePath()
        first.addLines(between: polygons[0]);
        first.closeSubpath()

        let second = CGMutablePath()
        second.addLines(between: polygons[1]);
        second.closeSubpath()

        let node = SKShapeNode(path: first)
        node.fillColor = .red
        node.strokeColor = .white
        node.lineWidth = 2

        let child = SKShapeNode(path: second)
        child.fillColor = .red
        child.strokeColor = .white
        node.lineWidth = 2
        node.addChild(child)

        let child2 = SKShapeNode(path: first)
        child2.fillColor = .red
        child2.strokeColor = .clear
        node.lineWidth = 2
        node.addChild(child2)


        addChild(node)
    }
}