使用convertToWorldSpaceAR翻译CCNode时出现问题

时间:2014-05-23 10:49:18

标签: ios objective-c cocos2d-iphone

我对Cocos2d实例的行为感到有点困惑,我需要一些帮助。我从Cocos2D CCNode position in absolute screen coordinates借用了这段代码。非常简单:两个物体,一个是另一个物体的孩子。

运行下面的代码片段,我得到的是worldCoord =(50,200)。我的期望是翻译会导致worldCoord =(100,150)。当我在CGAffineTransform中逐步执行代码时,tx = 100,并且ty = 150。为什么呢?

CCNode * myNode = [[CCNode alloc] init];
[myNode setAnchorPoint:CGPointZero];
myNode.position = CGPointMake(150.0f, 100.0f);

CCNode * mySprite = [[CCNode alloc] init]; // CCSprite is a descendant of CCNode
[mySprite setAnchorPoint:CGPointZero];
[myNode addChild: mySprite];
mySprite.position = CGPointMake(-50.0f, 50.0f);

// we now have a node with a sprite in in. On this sprite (well, maybe
// it you should attack the node to a scene) you can call convertToWorldSpace:
CGPoint worldCoord = [mySprite convertToWorldSpaceAR: mySprite.position];

1 个答案:

答案 0 :(得分:1)

考虑到mySprite是myNode的子节点,因此被myNode位置偏移:

myNode.position = CGPointMake(150.0f, 100.0f);
mySprite.position = CGPointMake(-50.0f, 50.0f);

那么你认为mySprite的世界pos应该是:

是正确的
X: (150 + -50) = 100
Y: (100 +  50) = 150

要获得精灵的世界位置,请使用convertToWorldSpace的非AR变体:

CGPoint worldCoord = [myNode convertToWorldSpace: mySprite.position];

请注意,您需要使用父节点进行转换,因为它定义了子节点的坐标空间。换句话说,子节点的原点(0,0)等同于其父节点的位置。

该方法的变体也不会受到精灵的anchorPoint变化的影响。更改精灵锚点时,只有'AR'变体的结果会发生变化。

“AR”变体只是将节点的anchorPoint添加到转换前的位置。假设您的精灵的contentSize为100x100且anchorPoint的默认值为0.5,0.5,则在转换为世界空间之前,会将{50}添加到mySprite.position。换句话说,它将精灵纹理的左下角与精灵位置之间的偏移添加到转换后的位置。