iOS - перетаскивание объектов по изогнутым путям - PullRequest
6 голосов
/ 24 мая 2011

Я рву волосы, пытаясь понять, что кажется очень легкой проблемой. Я знаю, что многие из этих вещей обсуждались по касательной, поэтому извиняюсь, если это ступает по хорошо покрытой земле, но я не могу найти ничего конкретного для своего решения (поверьте мне, я посмотрел).

По сути, я хочу перетащить объект / спрайт по заранее определенному изогнутому пути (не просто переместить его, а перетащить его). Подумайте о функции iPhone «Слайд для разблокировки», но вместо того, чтобы просто перетаскивать ползунок слева направо, сделайте траекторию дугой или волнистой линией.

Мое основное мышление было:

  • определить путь Безье, установить объект в начальной точке.
  • если к объекту прикоснулись, проверьте наличие обнаружения на пути Безье в touchesMoved (или какой-либо подобной функции). если касания остаются на пути, продвигайте спрайт вдоль пути до тех пор, пока путь не закончится (в этом случае задание завершено) или палец пользователя не сойдет с пути (в этом случае объект должен вернуться к началу).

Все это не тривиально (по крайней мере, так кажется). Например:

  • Обнаружение попадания на пути Безье - это королевская боль, так как вам действительно нужно делать это в штрихованной части, а не в заливочной части. И даже тогда я не могу найти способ сделать это на пути любой ширины - только на пути Безье в 1 точку.
  • Перемещение объекта частично вдоль пути даже не представляется возможным: все методы анимации перемещают спрайт по ВСЕМУ пути. Кроме того, для этого необходимо найти точку на пути, наиболее близкую к прикосновению пользователя, что, если вы когда-либо искали это, подразумевает поразительно сложную математику.
  • Я думал об использовании твердых тел, чтобы занимать все пространство, кроме пути, поэтому объект может двигаться только по пути. Однако для этого необходимо определить изогнутые твердые тела, некоторые из которых должны быть вогнутыми. Тупик.

Я делаю это слишком сложно? Это не кажется сложным. Мне не нужно полное решение, просто новый способ думать об этом и пнуть в правильном направлении. Любая помощь будет очень признательна.

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Как насчет этого?

  • Рассмотрим ось X вашего пути Безье.
  • Каждый раз, когда пользователь нажимает на экран или взаимодействует с ним, просто смотрите на х-часть касания
  • Отобразите координаты X по пути и переместите объект в правильное положение.
0 голосов
/ 24 мая 2011

Да, вы делаете это слишком сложно.

Возьмите предложенное выше упрощение (или вдоль круга, линии и т. Д.), Если оно работает, или если вы действительно хотите сделать это с кривой Безье, рассмотрите следующее:

  1. Посмотрите на определение кривой Безье
  2. Что вам нужно, так это определить новую позицию объекта P 'из текущей позиции P и изменение позиции касания D.
  3. Если перефразировать исходный P (x, y) в терминах t (кривые Безье являются параметрическими), тогда возникает проблема с поиском того, какое смещение t добавить на основе D.
  4. Что-то, связанное с дифференциалом Безье fn в P, может быть хорошим способом сделать это. То есть, сколько т было бы добавлено, если бы кривая была просто прямой линией, идущей из точки P вдоль кривой.

EDIT: Переход между сегментами: Если у каждого сегмента есть t в [0,1), то вы можете обнаружить t> = 1 и перейти к следующему сегменту, установив P в конец предыдущего сегмента и снова оценив движение относительно этой точки. Может потребоваться некоторая эвристика, если у вас много мелких точек и т. Д.

...