SpriteKit:我怎样才能确定物理实体上像applyImpulse这样的方法何时完成?

时间:2014-08-19 16:19:02

标签: ios sprite-kit ios8

我可以看到here如何使用update()函数监视" position"等属性。在SKNode上但我不知道如何知道像[node.physicsBody applyImpulse:vector]这样的方法是如何完成的。

-(void)someMethod {
    _monitorOn = YES;
    [_node.physicsBody applyImpulse:CGVectorMake(10,10)];
}
-(void)update:(CFTimeInterval)currentTime {
   if( _monitorOn == YES ) {
       NSLog(@"node position: %f,%f", _node.position.x, _node.position.y);
   }
   // When will this be turned off?
 }

2 个答案:

答案 0 :(得分:4)

以下两种方法可以检查applyImpulse的效果是否已完成:

if (_node.physicsBody.resting) {
   // Node is at rest, do something
}

您经常会发现静止属性从未设置过,因为您的精灵移动速度非常慢(特别是对于圆形节点)。因此,最好检查速度是否几乎为零。

static inline CGFloat speed(const CGVector v)
{
    return sqrtf(v.dx*v.dx+v.dy*v.dy);
}

if (speed(_node.physicsBody.velocity) < kSmallValue) {
   // Node is moving very slowly, do something
}

答案 1 :(得分:0)

applyImpulse只会为您的_node添加一些速度;只有当你调用它并且在一帧之后“完成”时才会这样做。我认为你真正想要的是当_node停止移动时(物理引擎会确定_node的速度为零)。要检查此情况,您可以查看SKPhysicsBody的{​​{3}}财产。只需在update:循环中检查它;当true _node已停止时。

-(void)update:(CFTimeInterval)currentTime {
     if( _monitorOn == YES ) {
         NSLog(@"node position: %f,%f", _node.position.x, _node.position.y);
     }

     if( _node.physicsBody.resting ) {
         NSLog(@"node is stopped");
     }
 }

注意: 您可能希望在某个位置设置一个添加标记,以便查看是否应该检查_node是否为resting,否则你将得到大量的“节点停止”消息。

-(void)someMethod {
    _monitorOn = YES;
    _appliedImpulse = YES;
    [_node.physicsBody applyImpulse:CGVectorMake(10,10)];
}

-(void)update:(CFTimeInterval)currentTime {
     if( _monitorOn == YES ) {
         NSLog(@"node position: %f,%f", _node.position.x, _node.position.y);
     }

     if( _appliedImpulse && _node.physicsBody.resting ) {
         _appliedImpulse = NO;
         NSLog(@"node is stopped");
     }
 }