iOS SpriteKit:以正确的方向移动节点

时间:2015-10-07 14:21:22

标签: ios objective-c sprite-kit skspritenode

掌握iOS和SpriteKit我正在使用Objective-C开发游戏。它基本上是一个自上而下的驾驶游戏,带有一个速度按钮和两个左右方向按钮。 但是,我似乎无法弄清楚如何正确地使转向工作。

到目前为止,我已经实现了三个按钮,这使得一个节点(汽车)向前移动并转向一定角度的角度。相关代码如下所示:

#define SK_DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) * 0.01745329252f)
#define SK_RADIANS_TO_DEGREES(__ANGLE__) ((__ANGLE__) * 57.29577951f)

@implementation GameScene {

    SKSpriteNode *car;

    int speed;
    int rotation; 

    BOOL turnRight;
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    // Drive button
    if ([node.name isEqualToString:@"driveNode"]) {

        speed = 120;
    }


    // Right
    if ([node.name isEqualToString:@"moveRight"]) {

        turnRight = YES;
        rotation = rotation + 20;
    }


    // Left
    if ([node.name isEqualToString:@"moveLeft"]) {

        rotation = rotation - 20;
    }
}

更新:

-(void)update:(CFTimeInterval)currentTime {

if (turnRight == YES) {
    NSLog(@"Turning right..");

    /*
    I imagine that calculations should be done here
    */

    }

    float angle = atan2f(speed, rotation);
    car.zRotation = angle - SK_DEGREES_TO_RADIANS(90);

    CGFloat rate = 1;
    CGVector relativeVelocity = CGVectorMake(rotation, speed - car.physicsBody.velocity.dy);
    car.physicsBody.velocity = CGVectorMake(rotation, car.physicsBody.velocity.dy + relativeVelocity.dy * rate);
}

我在turnRight

中将touchesEnded的值设置为NO

我的问题是,现在实施这种方式,汽车无法向右转,而不是水平转向。我想要的是当继续按下右键时,汽车最终应以恒定速度开圆。我无法弄清楚逻辑和数学如何实现它。

我已经检查了this question等等,这在某种程度上帮助了我,但我还没有完全弄明白。

有人能把我放在正确的方向吗?我已经浏览了网页并寻找解决方案,但是没有找到任何可以帮助我解决的问题。

1 个答案:

答案 0 :(得分:0)

您可能需要检查施加扭矩。它不会调整你的车速。

  
      
  • applyTorque:对物体施加扭矩。
  •   
     

宣言SWIFT func applyTorque(_ torque:CGFloat)OBJECTIVE-C    - (void)applyTorque:(CGFloat)torque参数扭矩扭矩量,单位为牛顿米。讨论此方法生成角度   身体加速而不会引起任何线性加速。该   force适用于单个模拟步骤(一帧)。

     

可用性适用于iOS 7.0及更高版本。另见 - applyForce: -   applyForce:atPoint:mass