【问题标题】:How to make a node to rotate around a point outside of the node in a spritekit game project如何使节点围绕spritekit游戏项目中节点外的点旋转
【发布时间】:2015-06-11 11:41:09
【问题描述】:

我遇到了这个答案,但我不清楚答案。有人可以提供一些示例代码吗?

创建一个 SKNode 并将其位置设置为旋转中心。将应该围绕该中心旋转的节点作为子节点添加到中心节点。将子节点的位置设置为所需的偏移量(即半径,例如 x + 100)。更改中心节点的旋转属性以使子节点围绕中心点旋转。

具体来说,“改变中心节点的旋转属性”是什么?

var centerNode: SKSpriteNode = SKSpriteNode(imageNamed: "image1")
centerNode.position = CGPointMake(self.frame.width/2, self.frame.height/2)
self.addChild(centerNode)

var nodeRotateMe: SKSpriteNode = SKSpriteNode(imageNamged: "image2")
nodeRotateMe.position = CGPointMake(self.frame.width/2 + 100, self.frame.height/2 + 100)
centerNode.addChild(nodeRotateMe)

// Change the rotation property of the center node to what??
centerNode.zRotation = ?

【问题讨论】:

    标签: ios swift skspritenode


    【解决方案1】:

    你有几个选择:

    1) 您可以通过手动更改zRotation 属性在SKSceneupdate: 方法中随时间旋转centerNode。您必须在每次调用 update: 时缓慢更改值,以实现逐渐轮换。

    请注意,zRotation 属性以弧度为单位,表示旋转 180 度等于 pi (M_PI)。 SKScene 努力以 60 FPS 的速度达到 update:,这意味着在 5 秒内旋转 360 度,每次调用更新都需要增加 1/300 度,每次更新将是 pi 的 1/150 .

    centerNode.zRotation = centerNode.zRotation + CGFloat(1.0/150.0 * M_PI)
    

    当然,不能保证您的场景能够以 60 FPS 的速度更新,因此您可能需要监控 update: 中的 currentTime 变量并进行相应调整。

    2) 可能更好,您可以使用 SKAction 为您旋转 centerNode

    let rotateAction = SKAction.rotateByAngle(CGFloat(2 * M_PI), duration: 5.0)
    centerNode.runAction(rotateAction)
    

    请注意,旋转角度的单位是弧度,而不是度数。另请注意,如果您不想在那里显示图像,centerNode 不必是 Sprite 节点;它可能是一个普通的 SKNode。

    【讨论】:

    • OK 我试试第二个选项。我以前在不同的场景中使用过它
    • 在大多数情况下,SKAction 是要走的路。它可以设置为自动重复旋转、采用最短路径、转到特定角度,甚至可以在动画完成时运行代码块。最重要的是,无论您的应用是否达到 60 FPS,它都会适当地旋转 sprite,而手动操作很痛苦。
    • 节点旋转,但子节点位置(与父节点的偏移)没有放置在我需要的位置。我应该换个问题问这个吗?
    • 我想通了定位。感谢您的专业知识
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多