【问题标题】:Consistent Rotation Speed, iOS Sprite Kit一致的旋转速度,iOS Sprite Kit
【发布时间】:2014-03-30 22:43:01
【问题描述】:

我想使用 SKAction 旋转方法围绕 z 轴旋转宇宙飞船,具体取决于触摸坐标。触摸后,飞船的鼻子应该指向触摸点。

CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors

SKAction *rotation = [SKAction rotateToAngle: rad duration: ??? shortestUnitArc:YES];

如何调整持续时间以使旋转速度始终相同(无论旋转角度多大)?

问题是弧度出现在从-pi到pi的区间内(因为atan2)。所以旋转取决于触摸的象限,速度也取决于。

【问题讨论】:

    标签: ios rotation sprite-kit


    【解决方案1】:

    我现在明白了:

    我已将弧度从 [-Pi, Pi] 转换为 [0, 2Pi]。

    CGFloat prevRad = sprite.zRotation; // actual sprite rotation
    if (prevRad < 0) prevRad = (M_PI)+((M_PI)+prevRad); // atan2 from 0 to 2PI
    
    CGFloat rad = atan2f(touchLocation.y - sprite.position.y, touchLocation.x - sprite.position.x); // calc rad between vectors
    if (rad < 0) rad = (M_PI)+((M_PI)+rad); // atan2 from 0 to 2PI
    

    然后我用新旧弧度的差除以一个因子:

    CGFloat factor = 4.0f;
    CGFloat diff = ABS(sprite.zRotation - rad);
    CGFloat time = diff / factor;
    
    SKAction *rotation = [SKAction rotateToAngle:rad duration: time shortestUnitArc:YES];
    rotation.timingMode = SKActionTimingEaseInEaseOut;
    [sprite runAction:rotation];
    

    【讨论】:

      【解决方案2】:
      CGFloat factor = 5.0; //Adjust this to get your desired speed.
      
      CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors
      
      CGFloat diff = ABS(node.zRotation - rad);
      
      CGFloat time = diff / factor;
      
      SKAction *rotation = [SKAction rotateToAngle: rad duration: time shortestUnitArc:YES];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多