Pregunta

I have a problem with the New game sprite... My "car" follows the track perfectly on the first lap but from then on it seems that its getting offset at the end of every lap. Could someone tell me what am I doing wrong ?

- (void)createSceneContents{
    self.backgroundColor = [SKColor blackColor];
    self.scaleMode = SKSceneScaleModeAspectFit;

    // CREATING THE CAR AND THE TRACK
    SKSpriteNode *myCar = [self newcar];
    myCar.position = [[self trackShape] position];;
    [self addChild:myCar];

    SKShapeNode *track = [self trackShape];
    track.position = CGPointMake(48, 40);
    [self addChild:track];
}



- (SKSpriteNode *)newcar{
    // GENERATES A RECTANGLE FOR THE SPRITE NODE
    SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(20,50)];
    CGPathRef pathRef = [[self bPath] CGPath];
    // CAR SHOULD FOLLOW THE TRACK
    // OK ONLY ON THE FIRST LAP
    SKAction *hover = [SKAction sequence:@[[SKAction followPath:pathRef duration:20.0],
                                    ]];

    hull.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hull.size];
    hull.physicsBody.dynamic = NO;
    [hull runAction: [SKAction repeatActionForever:hover]];
    return hull;
}


-(SKShapeNode *)trackShape{
    SKShapeNode *newshape = [[SKShapeNode alloc] init];
    newshape.position = CGPointMake(48, 40);
    newshape.path = [[self bPath] CGPath];
    newshape.fillColor = [SKColor clearColor];
    newshape.strokeColor = [SKColor blueColor];
    newshape.lineWidth = 8;
    return newshape;
}

This is the path... it's all in the same class.

-(UIBezierPath *)bPath{
    UIBezierPath* bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint: CGPointMake(48, 40)];
    [bezierPath addLineToPoint: CGPointMake(10.5, 147.5)];
    [bezierPath addCurveToPoint: CGPointMake(131.5, 209.5) controlPoint1: CGPointMake(10.5, 147.5) controlPoint2: CGPointMake(45.01, 253.16)];
    [bezierPath addCurveToPoint: CGPointMake(267.5, 209.5) controlPoint1: CGPointMake(217.99, 165.84) controlPoint2: CGPointMake(259.57, 194.46)];
    [bezierPath addCurveToPoint: CGPointMake(283.5, 302.5) controlPoint1: CGPointMake(275.43, 224.54) controlPoint2: CGPointMake(325.48, 263.29)];
    [bezierPath addCurveToPoint: CGPointMake(105.5, 327.5) controlPoint1: CGPointMake(241.52, 341.71) controlPoint2: CGPointMake(128.94, 352.5)];
    [bezierPath addCurveToPoint: CGPointMake(10.5, 396.5) controlPoint1: CGPointMake(82.06, 302.5) controlPoint2: CGPointMake(-27.5, 333.95)];
    [bezierPath addCurveToPoint: CGPointMake(239.5, 448.5) controlPoint1: CGPointMake(48.5, 459.05) controlPoint2: CGPointMake(195.5, 463.67)];
    [bezierPath addCurveToPoint: CGPointMake(283.5, 40.5) controlPoint1: CGPointMake(399.5, 40.5) controlPoint2: CGPointMake(375.39, 205.99)];
    [bezierPath addCurveToPoint: CGPointMake(153.5, 78.5) controlPoint1: CGPointMake(191.61, -124.99) controlPoint2: CGPointMake(153.5, 78.5)];
    [bezierPath addLineToPoint: CGPointMake(48, 40)];
    [bezierPath closePath];
    return bezierPath;
}
¿Fue útil?

Solución

After a while, this is my results

enter image description here

I scrapped your car method, and just placed it all within this.

I had to tweak the position of your track, but it seems to work.

- (void)createSceneContents{
    self.backgroundColor = [SKColor blackColor];
    self.scaleMode = SKSceneScaleModeAspectFit;

    SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(20,50)];
    CGPathRef pathRef = [[self bPath] CGPath];

    SKShapeNode *track = [self trackShape];
    //track.position = // scrap me.. is set in track shape method
    [self addChild:track];

    hull.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hull.size];
    hull.physicsBody.dynamic = NO;
    hull.position = CGPointMake(48, 40);
    [self addChild:hull];

    SKAction *hover = [SKAction followPath:pathRef asOffset:NO orientToPath:YES duration:5.0];
    [hull runAction: [SKAction repeatActionForever:hover]];
}

In your trackShape method, set the position to 0,0

newshape.position = CGPointMake(0, 0);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top