我想使用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
}
}
答案 0 :(得分:2)
你已经用你的双层方法得到了正确的想法,并且半开放在上面。但是,为什么不使用路径为半椭圆的形状节点,而不是在裁剪节点内使用形状节点?使用CGPath
或UIBezierPath
API创建一个 - 使用带有变换的圆弧使其成为椭圆形 - 然后create your SKShapeNode
from that path。
答案 1 :(得分:0)
您可以尝试将SKShapeNode
转换为SKSpriteNode
。您可以使用SKView textureFromNode:
(但我们知道只有在将节点添加到视图和至少运行一个更新周期后才需要使用它的比例问题),或者从头开始使用图像(当然以编程方式使用CGBitmapContext
创建)。