Sprite Kit:在DidBeginContact中更改zRotation

时间:2014-01-24 04:53:18

标签: ios sprite-kit

SKSpriteNode *_node;

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

为什么zRotation不起作用的任何想法?我尝试了NSLog并且它提供了正确的zRotation,但屏幕没有显示。

3 个答案:

答案 0 :(得分:1)

看看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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我有一个类似的问题,当设置zRotation和SKSpriteNode的位置时,physicsBody没有任何效果,而将physicsBody设置为nil一切正常。 正如joshd所说,在手动设置后,physicalBody的模拟会以某种方式覆盖这些值。因此,我的一个解决方法是暂时移除体,然后定向和定位精灵,然后从头开始或从存储的属性重新创建物理体

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