cocos2d親レイヤーの子として、次のzオーダーとディメンション(オフセットなし)を持つ3つのサブレイヤーがあります。
最上層:z:-1幅:2048高さ:2048
中間層:z:-2幅:1536高さ:1536
最深層:z:-3幅:1024高さ:1024
cocos2dで使用されるglViewのサブビューとしてUIScrollView(ViewControllerに接続されている)を使用して、各レイヤーの位置を次の比率で変換(したがってスクロール)します(したがって、3D効果を実現します)。
最上層:dragPt.x * 1(yについても同じ)
中間層:dragPt.x * 0.75(yについても同じ)
最深層:dragPt.x * 0.5(yについても同じ)
次のように、各レイヤーでユーザー入力を検出します
。-次のサイズのglViewに別のサブビュー(seeThroughと呼びます)をアタッチします(アプリは横向きモードです)
--(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
このサブビューで使用して、タッチポイントを「touchLocation」という名前のiVar。
-cocos2d-layerで、次のコードを使用して、各レイヤーのタッチ位置を決定します。
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ビューでキャプチャされたポイントから各レイヤーの負の位置の値を差し引くだけで、各レイヤーの座標系のタッチ位置を正しく特定できます。
問題は、そのような参照ポイントがまったくない場合です。たとえば、ユーザー入力なしでレイヤーの1つでスプライトの位置を取得しようとした場合です。
基準点がないので、cocos2dレイヤーの1つで特定の点を特定できる解決策を思い付くことができません。
私はいくつかの方法(convertToNodeSpace、convertToWorldSpace、そして日が経つにつれて最終的にはワイルドな数学)を試しましたが、どれも成功しませんでした。
したがって、私の質問は次のとおりです。レイヤーの1つにあるスプライトの位置を特定し、それを他のレイヤーの1つのスペースに変換するにはどうすればよいですか。
シナリオ:
-スプライトはdeepestLayerにありますが、midLayerの場所に移動したい
-スプライトはtopmostLayerにあり、deepestLayerに移動したい
-など...