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

6

我搜寻了一段时间,但由于某些原因始终找不到答案。看起来很简单,但也许我无法在库中找到正确的函数。

我有一个场景,其中包含一个带有一堆CCNode的图层,每个节点都有一个CCSprite。

在应用程序期间,我移动主图层的位置,以便以某种方式“平移”相机(即我将整个图层平移,以便视口发生变化)。

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

此外,作为额外的奖励,如果我可以将此位置表示为坐标系统,其中0,0映射到屏幕的左上角,而1,1映射到屏幕的右下角,那将是很棒的。(这样我就可以与所有设备兼容)

编辑:请注意,最好的解决方案应适用于任何CCNodes层级结构。

1个回答

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


太棒了。我差不多自己就做到了,只是犯了一个愚蠢的错误:没有考虑精灵本身的位置,而是考虑了节点的位置,这是行不通的。显然如此。但这太棒了,因为它还考虑了缩放等因素。太好了。给你五星。 - Tovi7
CCDirector在最近的cocos2d版本中没有displaySizeInPixels。有什么解决方法吗?(找到了winSizeInPixels,可能是它。) - Jonny
1
我知道这可能有点老了,但第6行的worldCoord = (50, 200)是正确的吗?我会期望worldCoord = (100, 150)。当我逐步执行时,我看到tx = 100,ty = 150作为转换......轴被交换了吗?我是否忽略了什么显而易见的东西? - gdbj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接