Ios 精灵套件:锚点正在改变精灵的实际位置

Ios 精灵套件:锚点正在改变精灵的实际位置,ios,sprite-kit,anchorpoint,Ios,Sprite Kit,Anchorpoint,请帮我把这个困惑弄清楚 从Sprite工具包编程指南: 精灵节点的“anchorPoint”属性决定了节点中的哪个点 框架位于精灵的位置 我的理解是,如果我更改锚点,精灵的位置应该保持不变,只有纹理渲染应该相应地移动 但是当我设置锚定点时,我的精灵的位置实际上改变了!请看以下片段: /* debug */ if (self.currentState == self.editState) { printf("B: relativeAnchorPoint = %.02f,%.02f ",

请帮我把这个困惑弄清楚

从Sprite工具包编程指南:

精灵节点的“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位置=1532.00384.00

B:相对点=0.65,0.48位置=1583.00384.00

我错过了什么

提前谢谢

*编辑:其他信息:*
只有当我的精灵将xScale设置为-1以反转图像时,才会发生这种情况。我做了一个快速测试以确认您的观察结果,它确实是正确的

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

我倾向于认为这是一个bug,因为负xScale和x位置的增加之间似乎没有相关性。这不能被认为是正常的行为

而且,只有在xScale已经为负值之后更改锚点时,才会发生这种情况。你们可以设置主播点,然后改变xScale,一切都会好的,位置不会改变

我确认这个问题在Xcode 5.1 iOS 7和Xcode 6 beta iOS 8 beta中都存在

如果在新创建的Sprite Kit项目中运行以下代码,而不是自动创建的MyScene.m文件,您将看到,当anchorPoint在0.0和1.0之间随机更改时,Sprite的位置始终保持不变,直到xScale属性更改为负值。在这一点上,位置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已经为负,则将其反转,然后设置锚点,然后重新反转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操作持续时间内保持不变。

精灵的位置是锚定点,因此当您更改锚定点时,它会移动。@Code Monkey这是一个误解,节点的位置就是它所在的位置,锚定点不应该更改节点的位置,它仅确定节点纹理的位置(相对于节点的位置)drawn@LearnCocos2D感谢您的澄清。也许最好避免将xScale设置为-1,而是使用预览应用程序工具>水平翻转来反转图像。@CodeMonkey,图像反转必须在运行中完成,因为我不想在我的代码中复制每个精灵的图像,这将是一个巨大的内存浪费……您忘记在第一个if语句中设置didInvert。@LearnCos2D,感谢您提供的解决技巧。有没有一种方法可以通知苹果公司这种想法?是的,在这里:一定要添加到这篇文章的链接,我认为这篇文章很好地解释了这个问题。