Изменение размера SKSpriteNode с его дочерними элементами

Я пытаюсь запустить последовательность SKActions на SKSpriteNode, у которого есть один дочерний элемент, все действия выполняются над двумя фигурами вместе, кроме:

[SKAction resizeToWidth:<#(CGFloat)#> height:<#(CGFloat)#> duration:<#(NSTimeInterval)#>]

Вот мой код:

-(void)CreateCards{
for (int i=0; i<3; i++) {
    SKSpriteNode *sprite=[SKSpriteNode spriteNodeWithImageNamed:@"default_circle.png"];
    SKSpriteNode *shape=[SKSpriteNode spriteNodeWithImageNamed:[self GetRandomImage]];
    [sprite addChild:shape];
    sprite.position=CGPointMake(-43, 345);
    sprite.size=CGSizeMake(43, 43);
    shape.size=CGSizeMake(43, 43);


    SKAction *zoom=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:CGPointMake(60, 345) duration:0.75],[SKAction resizeToWidth:80 height:80 duration:0.75], nil]];
    zoom.timingMode=SKActionTimingEaseOut;

    SKAction *zoomOut=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:[self GetLocationOfIndex:i NumberOfCircles:3] duration:0.5],[SKAction resizeToWidth:43 height:43 duration:0.5], nil]];

    zoomOut.timingMode=SKActionTimingEaseIn;


    SKAction *enter=[SKAction sequence:[NSArray arrayWithObjects:[SKAction waitForDuration:1*i],zoom,zoomOut, nil]];
    [sprite runAction:enter];


    [self addChild:sprite];
}

}


person Moataz Hossam    schedule 12.12.2013    source источник


Ответы (1)


Для достижения желаемого эффекта вы должны использовать масштабирование вместо изменения размера.

Заменять:

SKAction *zoom=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:CGPointMake(60, 345) duration:0.75],[SKAction resizeToWidth:80 height:80 duration:0.75], nil]];

С:

SKAction *zoom=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:CGPointMake(60, 345) duration:0.75],[SKAction scaleXBy:80/43 y:80/43 duration:0.75], nil]];

Следующий код должен работать для вашего случая:

-(void)CreateCards{
for (int i=0; i<3; i++) {
    SKSpriteNode *sprite=[SKSpriteNode spriteNodeWithImageNamed:@"default_circle.png"];
    SKSpriteNode *shape=[SKSpriteNode spriteNodeWithImageNamed:[self GetRandomImage]];
    [sprite addChild:shape];
    sprite.position=CGPointMake(-43, 345);
    sprite.size=CGSizeMake(43, 43);
    shape.size=CGSizeMake(43, 43);

    CGFloat zoomScale = 80 / 43;
    SKAction *zoom=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:CGPointMake(60, 345) duration:0.75],[SKAction scaleXBy:zoomScale y:zoomScale duration:0.75], nil]];
    zoom.timingMode=SKActionTimingEaseOut;

    SKAction *zoomOut=[SKAction group:[NSArray arrayWithObjects:[SKAction moveTo:[self GetLocationOfIndex:i NumberOfCircles:3] duration:0.5],[SKAction scaleXBy:1.0f y:1.0f duration:0.5], nil]];

    zoomOut.timingMode=SKActionTimingEaseIn;


    SKAction *enter=[SKAction sequence:[NSArray arrayWithObjects:[SKAction waitForDuration:1*i],zoom,zoomOut, nil]];
    [sprite runAction:enter];


    [self addChild:sprite];
}
}
person Dobroćudni Tapir    schedule 12.12.2013
comment
Спасибо за помощь :) - person Moataz Hossam; 12.12.2013
comment
Без проблем :). Также немного синтаксического сахара, вы можете использовать @[...] вместо [NSArray arrayWithObjects:...,nil]. ;) - person Dobroćudni Tapir; 12.12.2013