嗨,我有一堆圆形的 SKSpriteNodes,有一个圆形的 body 。现在,当这些球滚下一条路径时,我希望其中一些 SKSpritenodes 图像即使在滚动时也能保持直立。所以想一个向上的箭头。当球开始滚动时,箭头会转圈。但是对于某些球来说,即使球滚动,我也希望箭头保持向上。这样做的最佳方法是什么?
编辑
所以给出了一个答案,但从测试结果证明它不是正确的。不允许球旋转会影响它沿路径滚动的方式。所以我想我想要的是旋转,但图像总是出现在用户面前,就像它不旋转一样。谢谢。
最佳答案
这看起来像是 Superm 的工作 SKConstraint
.在物理模拟在每一帧上运行之后评估和应用约束,因此您可以将它们用于诸如使节点指向某个方向的任务,而不管物理对其做了什么。为此,您需要 zRotation
约束。
但除此之外还有更多。如果在球上设置零旋转约束:
// Swift
let constraint = SKConstraint.zRotation(SKRange(constantValue: 0))
ball.constraints = [constraint]
你会发现 SpriteKit 由于约束而在每一帧重置物理体的变换,所以它的行为只是有点像它在滚动。可能不是你想要的。 (为了更好地了解这里发生了什么,尝试在没有重力的世界中为矩形物理体添加零旋转约束,对其施加角冲量,并观察它尝试在
showsPhysics
转动的 View 中旋转你会看到 Sprite 和它的物理体不同步并且有点晃动——可能是由于物理引擎和约束引擎对抗时累积的舍入误差。)相反,您可以在 0x141E 的答案中做一些事情,但使用约束来减少代码(并更有效地运行):
等等,这不起作用——我告诉箭头不要旋转,但它仍然在旋转?!请记住,子节点相对于其父节点定位(并旋转和缩放)。所以箭头不是相对于球旋转,而是球在旋转。别担心,你仍然可以通过约束来解决这个问题:
现在约束将使箭头保持在原位,同时允许球旋转,但物理模拟希望它旋转。
这里有一些测试代码来说明:
// Step 1: A rectangular spinner so we can see the rotation
// more easily than with a ball
let spinner = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 300, height: 20))
spinner.position.x = scene.frame.midX
spinner.position.y = scene.frame.midY
spinner.physicsBody = SKPhysicsBody(rectangleOfSize: spinner.size)
scene.addChild(spinner)
spinner.physicsBody?.applyAngularImpulse(0.1) // wheeeeee
// Step 2: Make the arrow a child of the spinner
let arrow = SKSpriteNode(color: SKColor.greenColor(), size: CGSize(width: 20, height: 50))
spinner.addChild(arrow)
// Step 3: Constrain the arrow's rotation...
let constraint = SKConstraint.zRotation(SKRange(constantValue: 0))
arrow.constraints = [constraint]
// Step 4: ...relative to the scene, instead of to its parent
constraint.referenceNode = scene
关于ios - 设置永久 SKSpritenode 图像方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809288/