0

我有三個子層具有以下z順序和尺寸(無偏移),爲的cocos2d母層的小孩:視差:一個層上轉換的點到其它視差層座標空間

最上層:Z:-1寬度:2048高度:2048
中間層: Z:-2寬度:1536高度:1536
最深層:Z:-3寬度: 1024高度:1024

使用一個UIScrollView(附加到V iewController),如通過cocos2d中使用的glView的子視圖中,我翻譯(因此滾動)的每一層的位置,其中比率(從而實現3D效果):

最上層:dragPt.x * 1(同樣爲Y)
中間層:dragPt.x * 0.75(同樣爲Y)
最深 層:dragPt.x * 0.5(同樣爲Y)

我檢測每個層上的用戶輸入如下所示:
- 將另一個子視圖(我們稱之爲seeThrough)附加到glView w ith以下尺寸爲480x320(應用程序處於橫向模式)
- 在本子視圖中使用-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event,我將觸摸點存儲在名爲「touchLocation」的iVar中。
- 在我的cocos2d層我然後使用以下代碼來確定每個層上的觸摸位置:

CGPoint pointOnTopMostLayer = ccp(seeThrough.touchLocation.x - topMostLayer.position.x, (320 - seeThrough.touchLocation.y) - topMostLayer.position.y); 

CGPoint pointOnMidLayer = ccp(seeThrough.touchLocation.x - midLayer.position.x, (320 - seeThrough.touchLocation.y) - midLayer.position.y); 

CGPoint pointOnDeepestLayer = ccp(seeThrough.touchLocation.x - deepestLayer.position.x, (320 - seeThrough.touchLocation.y) - deepestLayer.position.y); 

(320是屏幕的高度和減去從有必要爲Y從UI轉換gl座標系)

當滾動圖層時,它們的位置是負值。 通過使用seeThrough視圖作爲參考平臺來捕獲480x320表面上的觸摸,我可以通過從seeThrough視圖中捕獲的點減去每個圖層的負位置值,成功確定每個圖層座標系上的觸摸位置。
問題是什麼時候沒有像這樣的參考點,例如,當我嘗試在沒有用戶輸入的情況下在其中一個圖層上獲取精靈的位置時。
沒有參考點,我發現自己無法想出一個解決方案,使我能夠確定其中一個cocos2d圖層上的任何特定點。

我嘗試了幾種方法(convertToNodeSpace,convertToWorldSpace,並且當天通過最終的野數學),都沒有成功。

因此,我的問題是:如何確定讓一個精靈在其中一個圖層上的位置並將其轉換爲其中一個圖層的空間?

方案:
- 一個精靈是在deepestLayer,但我想將它移動到一個位置上的中層衣
- 一個精靈是在topmostLayer,我想將它移動到deepestLayer
- etc ...

回答

2

你已經實現了從屏幕空間到每個圖層座標系的轉換。

如果您反轉這些轉換,它們將從圖層座標系回到屏幕空間。

舉例來說,您有:

pointOnTopMostLayer.x = screenspace.x - topMostLayer.position.x 
pointOnTopMostLayer.y = (320 - screenspace.y) - topMostLayer.position.y 

因此:

screenspace.x = pointOnTopMostLayer.x + topMostLayer.position.x 
screenspace.y = 320 - (pointOnTopMostLayer.y + topMostLayer.position.y) 

重複每一層。

現在,從圖層X到圖層Y,您將圖層X空間中的座標轉換回屏幕空間,然後轉換爲圖層Y空間。

+0

偉大的答案和一個具有驚人影響的解決方案!它使seethroughView冗餘,我能夠確定任何層上的任意點!謝謝!! – svrs 2012-03-28 18:56:25

+0

我是新來的。很高興有幫助:) – 2012-03-29 16:58:44