简体   繁体   中英

can't rotate a circle node around a fix point

I'm trying to set a SKShapeNode that rotating around fixed point depend on user's swipe gesture. to do so i'm using the code that answered here.

when I set the node as a rectangle - it's working just fine, the problem is when I trying to set the node as a circle (as I needed it to be). I have no idea why its happening, and what makes the difference.

here is the code that works ( SKShapeNode as a rectangle):

override func didMove(to view: SKView) {
    let ball = SKShapeNode(rect: CGRect(x: 100, y: 100, width: 100, height: 100))
    ball.fillColor = SKColor.red
    ball.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2)
    ball.name = "BALL"
    ball.physicsBody = SKPhysicsBody(circleOfRadius: 200)
    ball.physicsBody?.angularDamping = 0.25
    ball.physicsBody?.pinned = true
    ball.physicsBody?.affectedByGravity = false
    self.addChild(ball)

    let om = 5.0
    let er = 4.0
    let omer = atan2(om, er)
    print("om = \(om), er = \(er), atan2(omer) = \(omer)")


}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in:self)
        let node = atPoint(location)
        if node.name == "BALL" {
            let dx = location.x - node.position.x
            let dy = location.y - node.position.y
            // Store angle and current time
            startingAngle = atan2(dy, dx)
            startingTime = touch.timestamp
            node.physicsBody?.angularVelocity = 0
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches{
        let location = touch.location(in:self)
        let node = atPoint(location)
        if node.name == "BALL" {
            let dx = location.x - node.position.x
            let dy = location.y - node.position.y

            let angle = atan2(dy, dx)
            // Calculate angular velocity; handle wrap at pi/-pi
            var deltaAngle = angle - startingAngle!
            if abs(deltaAngle) > CGFloat.pi {
                if (deltaAngle > 0) {
                    deltaAngle = deltaAngle - CGFloat.pi * 2
                }
                else {
                    deltaAngle = deltaAngle + CGFloat.pi * 2
                }
            }
            let dt = CGFloat(touch.timestamp - startingTime!)
            let velocity = deltaAngle / dt

            node.physicsBody?.angularVelocity = velocity

            // Update angle and time
            startingAngle = angle
            startingTime = touch.timestamp
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    startingAngle = nil
    startingTime = nil
}

but when i change the SKShapeNode (inside my didMove function) to circle is just dont work - here is the changed code:

    override func didMove(to view: SKView) {
    let ball = SKShapeNode(circleOfRadius: 200)
    ball.fillColor = SKColor.red
    ball.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2)
    ball.name = "BALL"
    ball.physicsBody = SKPhysicsBody(circleOfRadius: 200)
    ball.physicsBody?.angularDamping = 0.25
    ball.physicsBody?.pinned = true
    ball.physicsBody?.affectedByGravity = false
    self.addChild(ball)

}

does anyone see/ know what am I dong wrong?

How would you expect to see that the shape is turning? Do you have something inside the shapenode with a texture that you can actually see rotating?

A turning circle shapenode looks the same as a static one. In the update loop of the scene grab the ball and print its zRotation to see if it's actually turning.

override func update(_ currentTime: TimeInterval) {
    var ball: SKShapeNode = childNodeWithName("BALL") as SKShapeNode
    print(ball.zRotation)
}

(this code was written without access to Swift so you might have to fix the syntax a tiny bit)

Remember the zRotation is measured in radians so it might not look how you expect but it it's changing then the SKShapeNode is actually rotating, you just can't see it. You'll have to add a child node that has something visible on it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM