[英]How to create a ring with 3D effect using Sprite Kit?
我想使用Sprite Kit創建具有3D效果的戒指。 (查看圖像)
我嘗試將SKNode子類化並添加兩個節點作為子節點。 (查看代碼)
一個節點是完整的SKShapeNode橢圓,另一個節點是使用具有較高zPosition的SKCropNode的半橢圓。
看起來不錯,但是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
}
}
您可以通過兩層方法和頂部的半邊條找到正確的想法。 但是,為什么不使用路徑為半橢圓形的形狀節點,而不是在裁剪節點內部使用形狀節點? 使用CGPath
或UIBezierPath
API創建一個-使用帶有轉換的圓弧使其變為橢圓形-然后從該路徑創建SKShapeNode
。
您可以嘗試將SKShapeNode
轉換為SKSpriteNode
。 您可以使用SKView textureFromNode:
但我們知道比例問題,要求您僅在將節點添加到視圖中並且至少運行一個更新周期后才使用它),或使用圖像從頭開始(通過編程方式使用CGBitmapContext
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.