У меня есть три подслоя со следующим z-порядком и размерами (без смещений) в качестве дочерних элементов родительского слоя cocos2d:
самый верхний слой: z: -1 ширина: 2048 высота: 2048
средний слой: z: -2 ширина: 1536 высота: 1536
самый глубокий слой: z: -3 ширина: 1024 высота: 1024
Использование UIScrollView (присоединенного к ViewController) в качествеПодвид glView, используемого cocos2d, я перевожу (и, следовательно, прокручиваю) положение каждого слоя со следующими соотношениями (таким образом, получая эффект 3D):
самый верхний слой: dragPt.x * 1 (то же самое для y)
средний слой: dragPt.x * 0.75 (то же самое для y)
самый глубокий слой: dragPt.x * 0.5 (то же самое для y)
Я обнаружил пользователявведите на каждом слое следующее:
- присоедините другое подпредставление (давайте назовем его seeThrough) к glView со следующими размерами 480x320 (приложение находится в ландшафтном режиме)
- используя -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
в этом подпредставлении, я сохраняюточка касания в iVar с именем «touchLocation».
- в моем слое 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 изИнтерфейс для системы координат gl)
При прокрутке слоев их положения отрицательны.Используя seeThrough вида в качестве эталонной платформы, чтобы захватить контакт на 480x320 поверхности, можно успешно определить положение касания на системе координат каждого слоя путем простого вычитания отрицательных значений положения каждого слоя с точки захваченной в seeThrough зрения.
Проблема в том, что такой контрольной точки нет вообще, например, когда я пытаюсь получить позицию спрайта на одном из слоев без ввода данных пользователем.
Не имея контрольной точки, я не могу прийтис решением, которое позволяет мне определить любую конкретную точку на одном из слоев cocos2d.
Я попробовал несколько методов (convertToNodeSpace, convertToWorldSpace, и, поскольку день прошел в конце концов дикие математические вычисления), ни один из них не увенчался успехом.
Поэтому мой вопрос: Как я могу определить положение, скажем, спрайта на одном из слоев и преобразовать его в пространство одного из других слоев?
Сценарии:
- спрайт включенон самый глубокий слой, но я хочу переместить его в местоположение в среднем слое
- спрайт находится на верхнем слое, и я хочу переместить его в самый глубокий слой
- и т. д.