如何使用Sprite Kit创建具有3D效果的环?

时间:2015-12-14 23:19:22

标签: ios swift sprite-kit skcropnode

enter image description here enter image description here

我想使用Sprite Kit创建一个具有3D效果的铃声。 (见图像)

我尝试了子类化SKNode并添加两个节点作为子节点。 (参见代码)

一个节点是一个完整的SKShapeNode椭圆,另一个是半椭圆,使用SKCropNode和更高的zPosition。

看起来不错,但SKCropNode将应用CPU使用率从40%提高到99%。

有关如何降低SKCropNode性能成本的任何想法,或任何创建相同环3D效果的替代方法?

class RingNode: SKNode {

    let size: CGSize

    init(size: CGSize, color: SKColor)
    {
        self.size = size
        self.color = color

        super.init()

        ringPartsSetup()
    }

    private func ringPartsSetup() {

        // LEFT PART (half ellipse)
        let ellipseNodeLeft = getEllipseNode()
        let leftMask = SKSpriteNode(texture: nil, color: SKColor.blackColor(), size: CGSize(
            width: ellipseNodeLeft.frame.size.width/2,
            height: ellipseNodeLeft.frame.size.height))
        leftMask.anchorPoint = CGPoint(x: 0, y: 0.5)
        leftMask.position = CGPoint(x: -ellipseNodeLeft.frame.size.width/2, y: 0)
        let leftNode = SKCropNode()
        leftNode.addChild(ellipseNodeLeft)
        leftNode.maskNode = leftMask
        leftNode.zPosition = 10 // Higher zPosition for 3D effect
        leftNode.position = CGPoint(x: -leftNode.frame.size.width/4, y: 0)
        addChild(leftNode)

        // RIGHT PART (complete ellipse)
        let rightNode = getEllipseNode()
        rightNode.position = CGPoint(x: 0, y: 0)
        rightNode.zPosition = 5
        addChild(rightNode)
    }

    private func getEllipseNode() -> SKShapeNode {
        let ellipseNode = SKShapeNode(ellipseOfSize: CGSize(
            width: size.width,
            height: size.height))
        ellipseNode.strokeColor = SKColor.blackColor()
        ellipseNode.lineWidth = 5
        return ellipseNode
    }    
}

2 个答案:

答案 0 :(得分:2)

你已经用你的双层方法得到了正确的想法,并且半开放在上面。但是,为什么不使用路径为半椭圆的形状节点,而不是在裁剪节点内使用形状节点?使用CGPathUIBezierPath API创建一个 - 使用带有变换的圆弧使其成为椭圆形 - 然后create your SKShapeNode from that path

答案 1 :(得分:0)

您可以尝试将SKShapeNode转换为SKSpriteNode。您可以使用SKView textureFromNode:(但我们知道只有在将节点添加到视图至少运行一个更新周期后才需要使用它的比例问题),或者从头开始使用图像(当然以编程方式使用CGBitmapContext创建)。