使用纹理旋转 SKShapeNode

Posted

技术标签:

【中文标题】使用纹理旋转 SKShapeNode【英文标题】:Rotate a SKShapeNode with texture 【发布时间】:2016-03-31 15:12:26 【问题描述】:

我正在尝试使用纹理旋转 SKShapeNode,但它不起作用。基本上,我有一个带有纹理的圆圈,我正尝试使用与SKSpriteNode 相同的方式使其旋转:

let spin = SKAction.rotateByAngle(CGFloat(M_PI/4.0), duration: 1)

问题是圆圈在旋转,而不是纹理。我可以使用以下代码进行检查:

let wait = SKAction.waitForDuration(0.5)
let block = SKAction.runBlock(
                     print(self.circle.zRotation)  
                     )
let sequence = SKAction.sequence([wait, block])
self.runAction(SKAction.repeatActionForever(sequence))

这是我用于创建SKShapeNode 的代码:

let tex:SKTexture = SKTexture(image: image)
let circle = SKShapeNode(circleOfRadius: 100 )
circle.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + 200)
circle.strokeColor = SKColor.clearColor()
circle.glowWidth = 1.0
circle.fillColor = SKColor.whiteColor()
circle.fillTexture = tex
self.addChild(circle)
// Runing the action
circle.runAction(spin)

请帮忙。提前致谢!

PS:我知道使用SKSpriteNode 会更好,但我的目标是将方形图像放在圆形框架中,我认为使用SKShapeNode 会是完美的。如果有人知道如何创建循环SKSpriteNode,请随时在答案部分发布! :)

这就是我想要实现的(具有旋转它的能力):

【问题讨论】:

你应该使用弧度而不是度数... 我试过了,还是不行,谢谢你的尝试:) 我没有说它会解决这个问题。我刚刚警告过错误使用接受弧度的 rotateToAngle 方法...... 哦,好吧...从现在开始我将使用弧度。 这听起来很傻,但你有没有执行过这个操作? 【参考方案1】:

您可以通过使用 SKCropNode 并将其 mask 属性设置为圆形纹理来实现您想要的:

override func didMoveToView(view: SKView) 

     let maskShapeTexture = SKTexture(imageNamed: "circle")

     let texture = SKTexture(imageNamed: "pictureToMask")

     let pictureToMask = SKSpriteNode(texture: texture, size: texture.size())

     let mask = SKSpriteNode(texture: maskShapeTexture) //make a circular mask

     let cropNode = SKCropNode()
     cropNode.maskNode = mask
     cropNode.addChild(pictureToMask)
     cropNode.position = CGPoint(x: frame.midX, y: frame.midY)
     addChild(cropNode)

假设要遮罩的图片大小为 300x300 像素。在这种情况下,您用作蒙版的圆圈必须具有相同的大小。意味着在图像编辑器中制作时,圆本身必须具有 150 像素(直径 300 像素)的半径。

Mask 节点决定了图片的可见区域。所以不要让它太大。遮罩节点必须是一个完全不透明的圆形,具有透明背景。

【讨论】:

以上是关于使用纹理旋转 SKShapeNode的主要内容,如果未能解决你的问题,请参考以下文章

旋转纹理时如何消除失真

OpenGL 旋转 2D 纹理

在GLSL ES中的片段着色器上旋转纹理

是否可以告诉 Xcode 不要在生成的纹理图集中旋转纹理?

使用 Swift 子类化 SKShapeNode

SpriteKit - 动画 SKShapeNode 形状路径