0

У меня есть три подслоев со следующим г-го порядком и размерами (без смещений) в качестве дочерних элементов cocos2d родительского слоя:параллакса: Преобразование точки на слой с другими параллаксом слоев координатами пространства

верхнего слоя : г: -1 ширина: 2048 высота: 2048
среднего слоя: г: -2 ширина: 1536 высота: 1536
глубокий слой: г: -3 ​​ширина: 1024 высота: 1024

Использование UIScrollView (прикрепленный к V iewController) как подвид из glView, используемого cocos2d, я переводить (и, следовательно, прокрутка) положение каждого слоя при следующем соотношении (благодаря чему достигается эффект 3D):

верхний слой: dragPt.x * 1 (то же самое для у)
среднего слоя: dragPt.x * 0,75 (то же самое для у)
самый глубокий слой : dragPt.x * 0,5 (то же самое для у)

Я обнаруживать ввод данных пользователем на каждом слое следующим образом:
- присоединить другое подзону (назовем это seeThrough) к glView w с размерами 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, я могу успешно определить положение касания в системе координат каждого уровня, просто вычитая значения отрицательной позиции каждого слоя из точки, захваченной в виде viewThrough.
Проблема в том, что такой точки вообще нет, например, когда я пытаюсь получить позицию спрайта на одном из слоев без ввода пользователем.
Не имея ориентира, я не могу найти решение, которое позволяет мне определить какую-либо конкретную точку на одном из слоев cocos2d.

Я пробовал несколько методов (convertToNodeSpace, convertToWorldSpace, а так как день прошел в конце концов дикие математики), ни один из них с успехом.

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

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

ответ

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 X, преобразуете обратно в пространство экрана, а затем трансформируете в пространство Y пространства.

+0

Отличный ответ и решение с поразительным ударом! Это сделало seethroughView избыточным, и я могу определить любую произвольную точку на любом слое! Спасибо!! – svrs

+0

Я здесь новый. Рад помочь :) –

Смежные вопросы