【问题标题】:UIBezierPath rotate around a point within the circle itself, swift and SpriteKitUIBezierPath 围绕圆内的一个点旋转,swift 和 SpriteKit
【发布时间】:2015-04-09 03:15:30
【问题描述】:

我使用以下代码设置了一个有 4 个偶数扇区的圆圈:

func centerCircle() {

    let center = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    // node1
    let node1bezierPath = UIBezierPath()
    node1bezierPath.addArcWithCenter(center, radius: 100, startAngle: 0.78, endAngle: 2.35, clockwise: true)
    node1bezierPath.addLineToPoint(center)

    let node1 = SKShapeNode(path: node1bezierPath.CGPath)
    node1.strokeColor = SKColor.redColor()
    node1.fillColor = SKColor.redColor()
    self.addChild(node1)
    // node2
    let node2bezierPath = UIBezierPath()
    node2bezierPath.addArcWithCenter(center, radius: 100, startAngle: 2.35, endAngle: 3.92, clockwise: true)
    node2bezierPath.addLineToPoint(center)

    let node2 = SKShapeNode(path: node2bezierPath.CGPath)
    node2.strokeColor = SKColor.blueColor()
    node2.fillColor = SKColor.blueColor()
    self.addChild(node2)
    // node3
    let node3bezierPath = UIBezierPath()
    node3bezierPath.addArcWithCenter(center, radius: 100, startAngle: 3.92, endAngle: 5.48, clockwise: true)
    node3bezierPath.addLineToPoint(center)

    let node3 = SKShapeNode(path: node3bezierPath.CGPath)
    node3.strokeColor = SKColor.greenColor()
    node3.fillColor = SKColor.greenColor()
    self.addChild(node3)
    // node4
    let node4bezierPath = UIBezierPath()
    node4bezierPath.addArcWithCenter(center, radius: 100, startAngle: 5.48, endAngle: 0.78, clockwise: true)
    node4bezierPath.addLineToPoint(center)

    let node4 = SKShapeNode(path: node4bezierPath.CGPath)
    node4.strokeColor = SKColor.yellowColor()
    node4.fillColor = SKColor.yellowColor()
    self.addChild(node4)

}

我想要实现的是,当我点击屏幕时,这个圆圈将围绕其中心旋转 90 度。

center = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))

我尝试设置 centerCircle() -> SKSpriteNode,并添加一个 SKAction.rotateByAngle,它不起作用。我在 StackOverflow 上搜索了其他一些帖子,也没有运气让它工作。 有什么想法可以让它工作吗? 非常感谢。

【问题讨论】:

    标签: ios swift sprite-kit uibezierpath


    【解决方案1】:

    您可以将SKShapeNodes 添加到SKNode,然后旋转SKNode。例如,您可以像这样创建SKNode 的自定义类

    class FourColorCircle : SKNode {
    
        override init() {
            super.init()
            self.createCircle()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        func createCircle () {
            let center = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
            // node1
            let node1bezierPath = UIBezierPath()
            node1bezierPath.addArcWithCenter(center, radius: 100, startAngle: 0.78, endAngle: 2.35, clockwise: true)
            node1bezierPath.addLineToPoint(center)
    
            let node1 = SKShapeNode(path: node1bezierPath.CGPath)
            node1.strokeColor = SKColor.redColor()
            node1.fillColor = SKColor.redColor()
            self.addChild(node1)
            // node2
            let node2bezierPath = UIBezierPath()
            node2bezierPath.addArcWithCenter(center, radius: 100, startAngle: 2.35, endAngle: 3.92, clockwise: true)
            node2bezierPath.addLineToPoint(center)
    
            let node2 = SKShapeNode(path: node2bezierPath.CGPath)
            node2.strokeColor = SKColor.blueColor()
            node2.fillColor = SKColor.blueColor()
            self.addChild(node2)
            // node3
            let node3bezierPath = UIBezierPath()
            node3bezierPath.addArcWithCenter(center, radius: 100, startAngle: 3.92, endAngle: 5.48, clockwise: true)
            node3bezierPath.addLineToPoint(center)
    
            let node3 = SKShapeNode(path: node3bezierPath.CGPath)
            node3.strokeColor = SKColor.greenColor()
            node3.fillColor = SKColor.greenColor()
            self.addChild(node3)
            // node4
            let node4bezierPath = UIBezierPath()
            node4bezierPath.addArcWithCenter(center, radius: 100, startAngle: 5.48, endAngle: 0.78, clockwise: true)
            node4bezierPath.addLineToPoint(center)
    
            let node4 = SKShapeNode(path: node4bezierPath.CGPath)
            node4.strokeColor = SKColor.yellowColor()
            node4.fillColor = SKColor.yellowColor()
            self.addChild(node4)
    
        }
    
        func rotate(angle : CGFloat, animated : Bool) {
            var rotateAction : SKAction!
    
            if animated {
                rotateAction = SKAction.rotateByAngle(angle, duration: 0.6)
            }
            else {
                rotateAction = SKAction.rotateByAngle(angle, duration: 0)
            }
    
            self.runAction(rotateAction)
        }
    }
    

    那你就可以这样使用了,

    let circle = FourColorCircle()
    addChild(circle)
    circle.position = CGPointMake(200, 200)
    circle.rotate(3.14/2, animated: true)
    

    【讨论】:

    • 嗨@rakeshbs,我是编程新手,你能在override init() { super.init() self.createCircle() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }上解释更多吗?谢谢。
    • 非常感谢,我去看看链接。
    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多