Я сделал быстрый тест, чтобы подтвердить ваше наблюдение, и оно действительно верно.
Поскольку xScale становится отрицательным, anchorPoint действительно влияет на позицию узла.
Я склонен думать об этом как о ошибке, поскольку, по-видимому, нет корреляции между отрицательным значением xScale и увеличением положения x. И это нельзя считать нормальным поведением.
Также это происходит только тогда, когда вы меняете anchorPoint после того, как xScale уже является отрицательным. Вы можете установить anchorPoint, затем изменить xScale как хотите, и все будет хорошо, позиция не изменится.
Я подтвердил, что эта проблема существует как в Xcode 5.1 (iOS 7), так и в бета-версии Xcode 6 (бета-версия iOS 8).
Если вы запустите следующий код во вновь созданном проекте Sprite Kit вместо его автоматически созданного файла MyScene.m, вы увидите, что при случайном изменении anchorPoint между 0,0 и 1,0 положение спрайта всегда остается неизменным до тех пор, пока свойство xScale изменяется на отрицательное значение. В этот момент position.x начинает значительно увеличиваться.
#import "MyScene.h"
@implementation MyScene
{
SKSpriteNode *sprite;
}
-(id) initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
self.backgroundColor = [SKColor colorWithRed:0 green:0 blue:0.2 alpha:1];
sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
sprite.anchorPoint = CGPointMake(0.2, 0.7);
[self addChild:sprite];
SKAction *action = [SKAction scaleXTo:-1.0 duration:10];
[sprite runAction:[SKAction repeatActionForever:action]];
}
return self;
}
-(void) update:(CFTimeInterval)currentTime
{
sprite.anchorPoint = CGPointMake(arc4random_uniform(10000) / 10000.0,
arc4random_uniform(10000) / 10000.0);
NSLog(@"pos: {%.1f, %.1f}, xScale: %.3f, anchor: {%.2f, %.2f}",
sprite.position.x, sprite.position.y, sprite.xScale,
sprite.anchorPoint.x, sprite.anchorPoint.y);
}
@end
Для этой ошибки существует обходной путь:
Если xScale уже имеет отрицательное значение, инвертируйте его, затем установите anchorPoint, а затем повторно инвертируйте xScale. Возможно, вам придется сделать то же самое с yScale, если он тоже может стать отрицательным.
Следующий метод обновления включает этот обходной путь, и я подтвердил, что он работает должным образом:
-(void) update:(CFTimeInterval)currentTime
{
BOOL didInvert = NO;
if (sprite.xScale < 0.0)
{
didInvert = YES;
sprite.xScale *= -1.0;
}
sprite.anchorPoint = CGPointMake(arc4random_uniform(10000) / 10000.0,
arc4random_uniform(10000) / 10000.0);
if (didInvert)
{
sprite.xScale *= -1.0;
}
NSLog(@"pos: {%.1f, %.1f}, xScale: %.3f, anchor: {%.2f, %.2f}",
sprite.position.x, sprite.position.y, sprite.xScale,
sprite.anchorPoint.x, sprite.anchorPoint.y);
}
Sprite.position теперь остается неизменным на протяжении всей продолжительности действия scaleXTo.
person
LearnCocos2D
schedule
30.07.2014