Создание собственного распознавателя жестов на основе методов касания?

У меня проблема с распознавателем жестов смахивания - иногда он работает медленно и требует некоторого расстояния для обнаружения. Например, иногда, когда вы немного двигаете пальцем, он не обнаруживает.

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

Поэтому я решил, что мне нужно реализовать свой собственный распознаватель смахивания. Или, может быть, есть библиотека, сделанная кем-то другим?

До сих пор я думал о том, чтобы сохранить местоположение касания в методе touchesBegan:, а затем проверить наличие новых местоположений в методах touchesMoved: или touchesEnded:. Затем я сравню расстояние и направление и выстрелю правильными методами.

Это правильный способ сделать это или я что-то упустил?


person Dvole    schedule 20.05.2014    source источник


Ответы (3)


Это правильный путь, но на самом деле далеко не простой. Я создал класс, который делает что-то подобное для меня (на самом деле для создания представления).

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

@property NSInteger maximumBufferSize;
@property (readonly) CGFloat traceLength;
@property (readonly) CGPoint traceSpeed;
- (void)begin:(CGPoint)point;
- (void)push:(CGPoint)point;
- (void)end:(CGPoint)point;

Довольно удобен в использовании. В вашем случае begin, push и end касания были начаты, касания перемещены и касания завершены (или отменены). Максимальный размер буфера — это количество точек, которые он будет хранить (N последних точек, полученных касаниями).

Вы должны понимать, что вам, вероятно, понадобится немного больше, чем если вы хотите игнорировать жесты смахивания (например, пользователь рисует круг пальцем). Чтобы делать такие вещи, вы можете вычислить средний путь трассы, а затем сравнить каждую подтрассу (point[i+1] - point[i]), чтобы dot(trace.averageWay, sub-trace.averageWay) = 1+-trashold.

Изменить: добавлена ​​ссылка на источник

Ссылка на источник

person Matic Oblak    schedule 20.05.2014
comment
Спасибо за отзыв, ваш класс доступен где-нибудь, чтобы проверить? - person Dvole; 20.05.2014
comment
Я добавил в класс геттер swipeDirection, который эффективно обнаруживает жест смахивания в любом направлении и возвращает путь жеста или (0,0), если это не жест смахивания. - person Matic Oblak; 20.05.2014

Вы можете прочитать это руководство [http://www.raywenderlich.com/44270/sprite-kit-tutorial-how-to-drag-and-drop-sprites%5d

Я уверен, что вы найдете решения для ваших проблем.

person LogPi    schedule 20.05.2014

person    schedule
comment
Спасибо за ваши усилия, но, как я уже сказал, у меня это работает в данный момент, и оно не может обнаружить короткие движения. Вот почему я думаю о своем собственном решении. - person Dvole; 20.05.2014