如何在此示例中获取_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);
非常感谢, 伊恩
答案 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)