На разработку собственной системы распознавания жестов меня натолкнул doodle от google на хеллоуин 2016. Достать код распознавания жестов оттуда не получилось, поэтому я решил притворится веломастером и сделать свой велосипед.
Для распознавания жеста нужно решить две задачи:
1. отбросить избыточные данные пользовательского ввода
2. на основе полученных данных угадать, что же хотел нарисовать пользователь
Для решения первой задачи я сначала хотел использовать библиотеку paper.js. Она умеет превращать набор точек в ломанаю линию или кривую Безье. Но она требует для своей работы дополнительный canvas и возвращает результат в крайне замысловатой структуре, поэтому от нее пришлось отказатся. К счастью, добрые люди давно выложили код функции для отбрасывания "ненужных" элементов с массива точек (установка погрешности около 10 позволяет получить вполне приличные результаты).
Следующий шаг - определить, на какую фигуру похожи наши точки. Умные люди с Вашингтонского университета разработали для этого библиотеки $1 и $p (для фигур с одной и нескольких линий соответсвенно), используя метод "тучи точек". Но, как показали опыты, библиотека оказалась слишком безотказной - она не умеет определять, что жест не похож ни на один из шаблонов.
Я решил использовать более простой, но весьма эффективный метод. Программа абстрагируется от реальных координат точек и запоминает только направление движения (-1, 0, 1 по вертикали и горизонтали); если два соседних направления одинаковы, то второе отбрасывается. Уже на основании этих направлений и подготовленных шаблонов программа решает, что за жест был нарисован.
Увидев пост о начале GitHubGameOff, я решил попытать судьбу и принять участие. Т.к. тема соревнования - throwback, я решил пересмотреть геймплей PAC-MAN и адаптировать его под распознавание жестов. Единственным рабочим вариантом было следующее размещение персонажей - протагонист стоит в центре, а враги приближаются от краев экрана. Но у Пакмана нет анимации спокойствия, поэтому было принято решение перевернуть игру с ног на голову - Блинки стал протагонистом, а Пакман - антагонистом.
Игру оценили вполне положительно: среди 209 игр она заняла 3-е место в категории Геймплей, 10-е в категории Инновационность и 20-е за общее впечатление.
Спасибо за внимание) Буду рад услышать отзывы и предложения