Параллакс: преобразование точки слоя в координатное пространство других слоев параллакса - PullRequest
0 голосов
/ 28 марта 2012

У меня есть три подслоя со следующим 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, и, поскольку день прошел в конце концов дикие математические вычисления), ни один из них не увенчался успехом.

Поэтому мой вопрос: Как я могу определить положение, скажем, спрайта на одном из слоев и преобразовать его в пространство одного из других слоев?

Сценарии:
- спрайт включенон самый глубокий слой, но я хочу переместить его в местоположение в среднем слое
- спрайт находится на верхнем слое, и я хочу переместить его в самый глубокий слой
- и т. д.

1 Ответ

2 голосов
/ 28 марта 2012

Реализовано преобразование из экранного пространства в каждую из систем координат слоя.

Если вы инвертируете эти преобразования, они перейдут из систем координат слоя обратно в пространство экрана.

Например, у вас есть:

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.

...