Sprite Kit:获取绝对节点位置

时间:2014-03-26 16:30:34

标签: ios sprite-kit

如何在此示例中获取_childNode的绝对位置:

我有父母: _worldNode

我有一个孩子: _childNode

我将_childNode位置设置为10,10。

我将_worldNode旋转90度。

现在,当我查询_childNode位置时,我得到10,10。当然不再是这种情况。甚至做[_childNode calculateAccumulatedFrame]给我一个10,10的CGRect。

任何想法如何返回正确的位置(-10,10)? 这是我测试的代码(只需放入init,所有日志返回10,10)。

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;
    CGPoint screenCentre = CGPointMake(screenHeight/2.0,screenWidth/2.0);

    _worldNode = [SKNode node];
    _worldNode.position = screenCentre;
    [self addChild:_worldNode];


    _childNode = [[SKSpriteNode alloc] initWithColor:[UIColor redColor] size:CGSizeMake(10, 10)];
    _childNode.position = CGPointMake(10, 10);
    [_worldNode addChild:_childNode];

    NSLog(@"position of child pre rotation %f, %f", _childNode.position.x, _childNode.position.y);

    _worldNode.zRotation = 90;

    NSLog(@"position of child after rotation %f, %f", _childNode.position.x, _childNode.position.y);

    CGPoint position = _childNode.position;
    [_childNode convertPoint:position toNode:_worldNode];

    NSLog(@"position of child after conversion %f, %f", position.x, position.y);

    CGRect groupRect = [_childNode calculateAccumulatedFrame];

    CGPoint newPosition = CGPointMake(groupRect.origin.x + (groupRect.size.width / 2), groupRect.origin.y + (groupRect.size.height / 2));
    NSLog(@"position of child based on frame %f, %f",newPosition.x,newPosition.y);

非常感谢, 伊恩

2 个答案:

答案 0 :(得分:2)

您的代码中存在很多错误。

<强> 1 -

_worldNode.position = screenCentre;  //This places the node at the SKScene centre

应该是

_worldNode.position = CGPointZero; //This places the node at the origin.

SKScene的默认坐标系的原点位于左下角。

<强> 2 -

_worldNode.zRotation = 90;

应该是

_worldNode.zRotation = M_PI_2;

zRotation以弧度而非度数来衡量。

第3 -

查看代码中的两个NSLog:

NSLog(@"position of child after rotation %f, %f", _childNode.position.x, _childNode.position.y); // - 1

CGPoint position = _childNode.position;
[_childNode convertPoint:position toNode:_worldNode]; //returns a CGPoint, where are you storing it?

NSLog(@"position of child after conversion %f, %f", position.x, position.y); // - 2

position变量实际上并未转换。该方法返回另一个CGPoint,而后者又需要记录。

但是,这将返回错误的位置,因为_childNode.position存储相对于其父级的位置(即_worldNode),因此使用convertPoint转换为_worldNode将会转换(10 ,10)在_childNode到_worldNode上,制作它(20,20)。

请尝试使用此行:

CGPoint position = [self convertPoint:_childNode.position fromNode:_worldNode];
NSLog (@"Position: %@", [NSValue valueWithCGPoint:position]);

这将为你提供场景w.r.t的位置,这就是你的目标。

答案 1 :(得分:1)

简而言之:旋转不会改变节点的位置。

SKSpriteNode的{​​{1}}为该节点返回position的位置。

当您旋转anchorPoint时,它会在SKSpriteNode上旋转,因此节点anchorPoint保持与旋转前相同的位置。这就是为什么你总是得到(10,10)