2011-04-23 40 views
6

我一直在寻找一段时间,并且由于某些原因我一直无法找到答案。这似乎很简单,但也许我无法在图书馆找到正确的功能。Cocos2D CCNode在绝对屏幕坐标中的位置

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

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

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

另外,作为一个额外的好处,如果我可以将这个位置表示为坐标系统,其中0,0映射到屏幕的左上角,并且1,1映射到屏幕的右下角,那将是非常棒的。 (所以我保持与所有设备兼容)

编辑:请注意,该解决方案应该适用于CCNodes的任何层次结构优选。

回答

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]; 

+0

啊辉煌。虽然我自己也犯了一个愚蠢的错误:没有采取精灵本身的位置,而是采取了不起作用的节点。显然。但这很棒,因为它也考虑到了缩放等问题。大。五颗星给你。 – Tovi7 2011-04-25 10:41:57

+0

CCDirector在最新版本的cocos2d中没有displaySizeInPixels。任何解决这个问题? (找到'winSizeInPixels',可能是吧。) – Jonny 2013-03-28 07:13:10

+1

我知道这是旧的,但是我得到worldCoord =(50,200)(第6行)是正确的吗?我期望worldCoord =(100,150)。当我通过时,我看到tx = 100,ty = 150作为变换...轴切换了吗?我错过了明显的东西吗? – gdbj 2014-05-23 10:16:14