2011-04-23 66 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