Sprite Kit:更改DidBeginContact中的zRotation

SKSpriteNode *_node; - (void)didBeginContact:(SKPhysicsContact *)contact { _node.alpha = 0.5; //this works _node.zRotation = 0.5; // this doesn't work } 

任何想法为什么zRotation不起作用? 我试图做NSLog ,它给出了正确的zRotation但屏幕没有显示。

看看SpriteKit的runloop的样子。 在物理模拟之后,才会绘制任何东西。 所以,即使您手动设置zRotation,它可能会被physicsBody覆盖并设置为自己的值。 尝试将NSLog放入-didSimulatePhysics方法中以在渲染之前获取zRotation。 我会尝试移动你的zRotation setter到-didSimulatePhysics。

操作顺序是

 -update: action evaluation -didEvaluateActions run physics -didSimulatePhysics render the scene 

参考: https : //developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Actions/Actions.html

另一个想法可能会起作用:将杠杆设置为接触对象,以便在杠杆被击中时得到回叫。 获取物体与杠杆碰撞的位置。 如果对象在错误的侧面/方向上碰撞,则尝试设置level.physicsBody.allowsRotation = NO; 否则将其设置为是。 如果这不起作用,您也可以尝试在这里强制使用zRotation。

我有一个类似的问题,当设置zRotation和SKSpriteNode与physicsBody的位置没有任何效果,而与physicalBody设置为零一切都好。 由于joshd假设physicsBody的模拟以某种方式覆盖了这些值后手动设置。 所以对我来说一个解决方法是临时删除身体,然后定位和定位精灵,然后从头开始或从存储的属性重新创build物理主体

 storedPhysicsBody = physicsBody physicsBody = nil position = newPosition zRotation = newZRotation physicsBody = storedPhysicsBody