SpriteNode does not match cgpath

I have a problem with the new game sprite ... My "car" is watching the track on the first lap perfectly, but from that moment it seems that it gets an offset at the end of each lap. Can someone tell me what I am 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 way ... all in one 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;
}
+4
source share
1 answer

After a while, these are my results

enter image description here

I abandoned your car method and just put it all in it.

I needed to adjust 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 position to 0,0

newshape.position = CGPointMake(0, 0);
+5
source

All Articles