Cocos2D CCNode在绝对屏幕坐标中的位置

时间:2011-04-23 19:52:52

标签: iphone objective-c cocos2d-iphone

我一直在寻找一段时间,但由于某些原因我无法找到答案。这看起来很简单,但也许我在库中找不到合适的功能。

我有一个场景,其中包含一堆CCNode,每个CCNode中都包含一个CCSprite。

在应用程序中,我在主层的位置移动,以便在某种程度上围绕摄像机“平移”。 (即我翻译整个图层以便视口改变)。

现在我想确定屏幕坐标中CCNode的绝对位置。 position属性返回相对于父节点的位置,但我真的希望将其转换为屏幕上的实际位置。

另外,作为额外的奖励,如果我能将这个位置表示为坐标系,其中0,0映射到屏幕的左上角,1,1则映射到屏幕的右下方,这将是非常棒的。 (所以我保持与所有设备兼容)

编辑:请注意,该解决方案最好适用于任何CCNode层次结构。

1 个答案:

答案 0 :(得分:18)

每个CCNode及其后代都有一个名为convertToWorldSpace的方法:(CGPoint)p

返回相对于场景的坐标。

当你有这个坐标时,翻转你的Y轴,你想要0,0在左上角。

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

CCSprite * mySprite = [[CCSprite alloc] init]; // CCSprite is a descendant of CCNode
[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 convertToWorldSpace: mySprite.position];

// to convert it to Y0 = top we should take the Y of the screen, and subtract the worldCoord Y
worldCoord = CGPointMake(worldCoord.x, ((CGSize)[[CCDirector sharedDirector] displaySizeInPixels]).height - worldCoord.y);

// This is dry coded so may contain an error here or there.
// Let me know if this doesn't work.

[mySprite release];
[myNode release];