суббота, 5 ноября 2011 г.

Мышиная возня

Если мы делаем шутер, то нужно отлавливать в первую очередь события MOUSEPRESSED, а не MOUSECLICKED. Иначе, если игрок быстро щелкает мышью, то эффект возникает странный. MOUSEPRESSED генерится на каждый щелчок, а MOUSECLICKED может вообще не сгенерироваться. Хотя по идее должно - с количеством нажатий. Подозреваю что там идет проверка чтобы нажатия были рядом, и если нет - многократный щелчок просто отбрасывается.

К слову сказать, нормальных двойных щелчков я тоже не наблюдал. Если делаешь нормальный двойной щелчок - идут два щелчка.

Так что вместо MOUSECLICKED - MOUSEPRESSED, а если же нам все таки нужен двойной щелчок, то реализуем его логику сами - ловим MOUSE_PRESSED, отслеживаем координаты и время между кликами, а дальше - если то что одинарный клик уже прошел для нас несущественно, то все легко и просто, а если существенно... Нужна некоторая задержка в обработке кликов. Проще всего сделать подсчет времени при рендеринге (все равно обработка мыши у нас там) и брать в дальнейшую обработку клики которые отлежались заданное время, в течение которого они могут превратиться в двойные клики... Уфф...

 

Обработка мышиных событий при рендеринге

 Как меня угораздило? А жизнь заставила. Собственно сейчас (при работе в 2D) в этом большой необходимости нет, но этот кусок унаследован от предыдущего (3D) варианта... А там чтобы выяснить куда мы мышью попали, нужно было произвести некий танец с бубном вокруг gluUnProject. И танец этот нужно проводить там, где мы имеем доступ к текущим матрицам - уже полностью подготовленнным. Что возможно только при рендеринге.

Более того, если мы по событиям мыши передвигаем камеру и т.д. и т.п., то матрицы меняются и картинку желательно тут же перерисовать. Так что алгоритм выглядит примерно так

  1. Формируем матрицы
  2. Проверяем очередь событий мыши (а в стандартном обработчике мы их туда заталкиваем)
  3. Обрабатываем мышь, если есть что обрабатывать
  4. Если надо заново формируем матрицы
  5. теперь только рисуем

В 2D координаты отслеживаются тривиально, можно обойтись без этого, ну а если вдруг потом приспичит перейти на 3D?

 

P.S. Как же иногда задалбывают слишком "умные" программы. Ну зачем, скажите, ScribeFire упорно заменяет символ _ на выделение курсивом? Причем не везде, а выборочно? 

P.P.S. Ну где бы найти хороший блог-клиент, чтобы все было удобно, без глюков и работало под Ubuntu?

Комментариев нет:

Отправить комментарий