Sprite Kit:Anchor Point正在改变Sprite的实际位置

时间:2014-07-30 07:47:02

标签: ios sprite-kit anchorpoint

请帮助我解决这个困惑。

从Sprite Kit编程指南:

  

精灵节点的anchorPoint属性确定中的哪个点   框架位于精灵的位置。

我对此的理解是,如果我改变锚点,精灵的位置应保持不变,只应相应地移动纹理渲染。

但是当我设置锚点时,我的精灵位置实际上发生了变化!看一下这个片段:

/* debug */
if (self.currentState == self.editState) {
    printf("B: relativeAnchorPoint = %.02f,%.02f  ", relativeAnchorPoint.x, relativeAnchorPoint.y);
    printf("position = %.02f,%.02f\n",self.position.x, self.position.y);
}

[self setAnchorPoint:relativeAnchorPoint];

/* debug */
if (self.currentState == self.editState) {
    printf("A: relativeAnchorPoint = %.02f,%.02f  ", relativeAnchorPoint.x, relativeAnchorPoint.y);
    printf("position = %.02f,%.02f\n",self.position.x, self.position.y);
}

输出:

  

A:relativeAnchorPoint = 0.65,0.48 position = 1532.00,384.00

     

B:relativeAnchorPoint = 0.65,0.48 position = 1583.00,384.00

我错过了什么?

提前致谢

*编辑:其他信息:* 它只发生在我的精灵将xScale设置为-1以反转图像

1 个答案:

答案 0 :(得分:0)

我做了一个快速测试以确认你的观察,这确实是正确的。

当xScale变为负值时,anchorPoint实际上会影响节点的位置

我倾向于将此视为错误,因为负xScale与x位置的增加之间似乎没有相关性。并且它不能被视为正常行为。

此选项仅在xScale已经为负数后更改anchorPoint时发生。您可以设置anchorPoint,然后根据需要更改xScale,一切都会正常,位置不会改变。

我确认Xcode 5.1(iOS 7)和Xcode 6 beta(iOS 8 beta)都存在此问题。

如果在新创建的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也可能变为负数,您可能需要对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动作持续时间内保持不变。