Реализация события встряхивания? - PullRequest
5 голосов
/ 11 ноября 2010

Я создаю графический интерфейс API для игр, и одной из запрошенных функций было событие встряски.По сути, это событие очень похоже на Aero Shake в Windows 7.Когда мышь нажата, если она быстро перемещается назад и вперед в одном направлении, происходит событие.Я просто не уверен, какой тип psedocode вошел бы в это?

Ответы [ 4 ]

9 голосов
/ 11 ноября 2010

Я мог бы рассмотреть что-то вроде этого:

  1. всегда создает вектор для направления, в котором мышь двигалась в своем последнем движении
  2. всегда ведет запись непосредственно предшествующего вектора, так какВы собираете следующий вектор (что означает, что у вас всегда есть два вектора для оценки).
  3. создайте точечное произведение двух векторов по мере поступления каждого ввода мышью.Если скалярное произведение положительно, игнорируйте его.Если оно отрицательное, установите для него значение времени и сохраните его в массиве, в котором может храниться до пяти таких отметок времени.
  4. повторите вышеописанную последовательность.Если массив временных меток имеет последовательный набор временных меток, каждая из которых отличается по эпсилону, то можно предположить, что кто-то что-то трясет.:)
6 голосов
/ 11 ноября 2010

Вам нужно посчитать изменения в движении мыши.Если мышь меняет направление более чем в 3 раза менее чем, скажем, за 0,7 секунды, то это сотрясение.Для обнаружения изменения направления следа навсегда 5 последних координат мыши.Если точка P0 является последней, а P5 пятой и последней, рассчитайте угол между P0-P3 и P3-P5.Если угол не превышает 5 градусов, мышь меняет направление.

3 голосов
/ 11 ноября 2010

Общая идея будет выглядеть примерно так:

При нажатии мыши:

  1. Сохранить текущую позицию как (x0, y0).
  2. Set slope = 0.
  3. Set start time = current time.

При перемещении мыши:

  1. Сохранить текущую позициюкак (x, y).
  2. Установить newSlope = abs((y - y0) / (x - x0)).(это указывает направление движения мыши относительно начальной позиции)
  3. Если abs(newSlope - slope) < some threshold, то пользователь все еще движется в том же направлении: затем проверьте, если current time - start time > shake time, если это так, запустите событие встряхиванияи сброс start time.
  4. В противном случае пользователь изменил направление.Установите slope = newSlope и сбросьте start time = current time.
0 голосов
/ 11 ноября 2010

Я нашел более элегантный и более конкретный ответ. Отслеживайте последние N (скажем, 20) позиций мыши. Эти позиции ограничены прямоугольником, вершина которого минимальная (P (N) .top), нижняя = максимальная (P (N) .bottom) и т. Д. Вычислить общее расстояние, на которое мышь переместилась за последние N раз. Если общее пройденное расстояние более чем в K раз превышает периметр этого прямоугольника, то это сотрясение.

...