Forums Logo

Здравствуйте Гость ( Вход | Регистрация )

[ Каскадный ] · Стандартный · Линейный

> Диагонали на F200, Как ловить диагонали?

radzh
post Понедельник, 27 октября 2008, 10:30
Отправлено #1


Фанат
***

Группа: Пользователи
Сообщений: 238
Регистрация: 07 авг. 2008
Пользователь №: 27 750





Братцы, а как отслеживать диагональные клавиши на джойстике? У F200 он разделён на четыре кнопки, как ни нажимай - сперва приходит событие от них, только потом от второго направления.

Делать задержку реакции не хочется, будет впечатление, что интерфейс тормозит. Есть какой-то штатный ход?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topicStart Poll
Ответов
Hahahoj
post Вторник, 28 октября 2008, 00:32
Отправлено #2


Зомби
*******

Группа: Пользователи
Сообщений: 10 730
Регистрация: 17 дек. 2004
Пользователь №: 12 002





Лови "чиста типовой" шаблон из моего движка (описал всё что происходит, чтобы не осталось вопросов):

CODE
//тело процедуры опроса клавиатуры. Вызывается раз в рабочий цикл
 if (SDL_PollEvent(&event))
// считываем значения событий ввода в переменную event
           switch (event.type)
// проверяем тип события и реагируем на него в зависимости от типа и
// источника (клавиатура компа/джойстик GP и т.п.
           {
               #ifdef GP2X
               case SDL_JOYBUTTONDOWN:
// проверяем гп-шный стик
               {
                   AEKey=event.jbutton.button;
// я сохраняю последние событие для возможности углубленного анализа
                   AEAnyKey=true;
// активизируем флаг говорящий о нажатии како-то кнопки
                   temp_KEY=false;
// временный флаг, говорящий о том, что была нажата какая-то из
//кнопок  входящих в комбинации
                    switch( AEKey )
{
                       case GP2X_BUTTON_UP:
                       {
                           temp_KEY=true;
// устанавливаем флаг, говорящий, что нажата кнопка возможно
// входящая в комбинацию
                           AEUp=true;
// устанавливаем флаг говорящий что нажата кнопка вверх
                           break;
                       }
                       case GP2X_BUTTON_LEFT:
                       {
                           temp_KEY=true;
// устанавливаем флаг, говорящий, что нажата кнопка возможно
// входящая в комбинацию
                           AELeft=true;
// устанавливаем флаг говорящий что нажата кнопка вверх
                           break;
                       }
                       case GP2X_BUTTON_A:
                       {
                           AEbuttonA=true;
                           break;
// эта кнопка (А) не входит в комбинацию
                       }
//  .....
// Далее, всё стандартно, таким образом заканчиваем ветку " if
//(SDL_PollEvent(&event))"

                       default:
                       break;
                    }    
              }
              #endif
              default:
              break;
   }

  AESync();
// Здесь при необходимости ставим задержку, которую подбираем на самой
// гп2х вручную так, чтобы успевала отработаться внутренняя процедура
// обновления очереди, у меня в этом месте стоит процедура
// синхронизации всей программы  

   if (temp_KEY)
// Если флаг нажатия кнопки дубля установлен - проверяем нажатие второй кнопки входящей в комбинацию:
   {
      //проверка на дубль          
      if (SDL_PollEvent(&event))
// снова читаем данные по SDL_PollEvent(&event) - нам приходит второй
//  код если нажата комбинация. Если нажата одиночная клавиша - не
// придет ничего
           switch (event.type)
           {
               case SDL_JOYBUTTONDOWN:
               {
                   AEKey=event.jbutton.button;
                   switch( AEKey )
                  {
[ЭТО МЫ ПОМЕНЯЕМ!!!]                        
                       case GP2X_BUTTON_UP:
                       {
                           AEUp=true;
// устанавливаем флаг, говорящий что нажата кнопка вверх
                           break;
                       }
[/ЭТО МЫ ПОМЕНЯЕМ!!!]
                       case GP2X_BUTTON_LEFT:
                       {
                            AELeft=true;
                            break;
                       }
// кнопки не входящие в комбинации здесь не проверяем
                       default:
                       break;
}
               }
               default:
               break;
           }
   }
   return 0;
}



Проверка события в результате самом коде проста:

CODE

if ((AEUp)&&(AELeft))
{
  // сработала диагональ вверх-влево
}
//НО!
if ((AEUp)&&(!AELeft))
{
  // сработала клавиша вверх
}


Собственно указанная выше процедура работала у меня для отлова комбинаций кнопок не являющихся диагональными (у меня F100), для твоих нужд можно слегка модернизировать заменив CASE-проверку второй кнопки в комбинации приблизительно по такому варианту:

CODE
                       case GP2X_BUTTON_UP:
                       {
                           if (AELeft)
                           {
                                AELeft=false;
                                AEUpLeft=true;
                            };
                           if (AERight)
                           {
                               AERight=false;
                               AEUpRight=true;
                            };
                            if (!(AEUpRight||AEUpLeft))
                               AEUp=true;
// проверяем, вдруг клавиша направления нажата одновременно с другой
// кнопкой , к примеру,  файра?
                            break;
                       }

Тогда получаем практически дубль диагональных кнопок F100 и отпадает необходимость возится с разными модификациями GP2x и в дальнейшем Wiza ( там будет 8 направлений ). При этом и недиагональные направления нажатые одновременно с кнопкой файра будут нормально срабатывать.


--------------------
«Не стоит сердиться на плохих людей. Знаешь, для чего их создал Бог? Чтоб мы смотрели на них и старались быть совсем другими».
» Моя прелесть «

user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Posts in this topic


Reply to this topicStart new topic
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
 

Упрощённая версия Сейчас: Сб., 28 июня 2025, 12:23
Skin Designed (c) by Rooq.net, All Rights Reserved.