Forums Logo

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

 
Reply to this topicStart new topicStart Poll

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

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

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


Фанат
***

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





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

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


Sing along at the Opera
Group Icon

Группа: Профи
Сообщений: 3 391
Регистрация: 06 янв. 2006
Пользователь №: 14 791





если ты про пятнашки, то советую завести "плавающий курсор"
при нажатии кнопки - он плавно перетекает в заданном направлении и когда дойдёт до следующей клетки (залезет этак на пяток пикселей), то тогда и передвигается сам большой курсор...

... хотя нафиг в пятнашках диагонали smile.gif. Я для примера.

Если ты пишешь файтинг, и приём начинается с диагонали, то просто следует отслеживать очередь команд (хороший пример в тренировке Last Bronx)


--------------------
12 удачных сделок в барахолке gbx.ru
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
radzh
post Понедельник, 27 октября 2008, 19:41
Отправлено #3


Фанат
***

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





QUOTE (quasist @ Понедельник, 27 октября 2008, 19:32)
если ты про пятнашки, то советую завести "плавающий курсор"
при нажатии кнопки - он плавно перетекает в заданном направлении и когда дойдёт до следующей клетки (залезет этак на пяток пикселей), то тогда и передвигается сам большой курсор...

... хотя нафиг в пятнашках диагонали :). Я для примера.

Если ты пишешь файтинг, и приём начинается с диагонали, то просто следует отслеживать очередь команд (хороший пример в тренировке Last Bronx)
*

У меня снова головоломка, там кораблик из своей клетки передвигается в одном из восьми направлений. Проблема в том, что нажать одновременно (как у тебя в шаблоне) два направления невозможно, он по-любому сперва присылает либо вертикальную, либо горизонтальную кнопку. Я сделал задержку, которая ждёт 50 мс и, если больше ничего не приходит, то отрабатывает кнопку; соответственно, если приходит вторая кнопка, то отрабатывает, как диагональ. Но из-за этой задержки впечатление, что интерфейс тормозит, собака.

Никакого чистого типового решения нет?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Hahahoj
post Вторник, 28 октября 2008, 00:32
Отправлено #4


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

Группа: Пользователи
Сообщений: 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
Hahahoj
post Вторник, 28 октября 2008, 03:29
Отправлено #5


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

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





Кстати, если будет нужда в кодинге более продвинутых игрушек изучи это:

http://www.gp32x.com/board/index.php?showtopic=23939

и это:

http://wiki.gp2x.org/wiki/Suggested_Joystick_Configurations

В конце странички Вики есть исходники готового проектика с реализацией нормального управления.


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

user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
quasist
post Вторник, 28 октября 2008, 12:00
Отправлено #6


Sing along at the Opera
Group Icon

Группа: Профи
Сообщений: 3 391
Регистрация: 06 янв. 2006
Пользователь №: 14 791





QUOTE (Hahahoj @ Вторник, 28 октября 2008, 00:32)
и отпадает необходимость возится с разными модификациями GP2x и в дальнейшем Wiza ( там будет 8 направлений )
*

В gp2x тоже 8 направлений.
Ты какую тулчейну юзаешь?


--------------------
12 удачных сделок в барахолке gbx.ru
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Hahahoj
post Вторник, 28 октября 2008, 14:44
Отправлено #7


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

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





В гп2х мк2 их всего 4. И комбинации.
Иногда кодеблоки с последним gcc, иногда брудшелл с первым.
.ЗЫ Описался по недогляду. Имелся ввиду F200 и перемоденные некоторыми модами F100

Сообщение отредактировал Hahahoj - Вторник, 28 октября 2008, 18:53


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

user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
quasist
post Вторник, 28 октября 2008, 15:05
Отправлено #8


Sing along at the Opera
Group Icon

Группа: Профи
Сообщений: 3 391
Регистрация: 06 янв. 2006
Пользователь №: 14 791





QUOTE (Hahahoj @ Вторник, 28 октября 2008, 14:44)
В гп2х мк2 их всего 4. И комбинации.
Иногда кодеблоки с последним gcc, иногда брудшелл с первым.
*

Зачем тогда у меня SDL определяет восемь???

и

CODE

enum MAP_KEY
{
VK_UP         , // 0
VK_UP_LEFT    , // 1
VK_LEFT       , // 2
VK_DOWN_LEFT  , // 3
VK_DOWN       , // 4
VK_DOWN_RIGHT , // 5
VK_RIGHT      , // 6
VK_UP_RIGHT   , // 7
VK_START      , // 8
VK_SELECT     , // 9
VK_FL         , // 10
VK_FR         , // 11
VK_FA         , // 12
VK_FB         , // 13
VK_FX         , // 14
VK_FY         , // 15
VK_VOL_UP     , // 16
VK_VOL_DOWN   , // 17
VK_TAT          // 18
};


Сообщение отредактировал Hahahoj - Вторник, 28 октября 2008, 18:47


--------------------
12 удачных сделок в барахолке gbx.ru
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Hahahoj
post Вторник, 28 октября 2008, 18:48
Отправлено #9


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

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





Потому что у тебя не перемоденный джой и не F200


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

user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
radzh
post Четверг, 30 октября 2008, 12:07
Отправлено #10


Фанат
***

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





QUOTE (Hahahoj @ Вторник, 28 октября 2008, 00:32)
Лови "чиста типовой" шаблон из моего движка (описал всё что происходит, чтобы не осталось вопросов):

Огромное душевное спасибо! :)

Перебрал всё детально. К сожалению, необходимость вызова задержки типа AESync() всё равно создаёт впечатление, что интерфейс тормозит. Видимо, для динамичных игр надо вообще читать SDL_JoystickGetButton() напрямую.

Теперь осталось поддержку стилуса прикрутить, и выложу на погляд новую цацку :)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

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

Упрощённая версия Сейчас: Пт., 19 апр. 2024, 08:56
Skin Designed (c) by Rooq.net, All Rights Reserved.