|
Здравствуйте Гость ( Вход | Регистрация ) Доступ из РоссииДля сохранения достпа из России к сайту и форуму GBX
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() |
Диагонали на F200, Как ловить диагонали?
| radzh |
Понедельник, 27 октября 2008, 10:30
Отправлено
#1
|
|
Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 242 Регистрация: 07 авг. 2008 Пользователь №: 27 750 ![]() ![]() |
Братцы, а как отслеживать диагональные клавиши на джойстике? У F200 он разделён на четыре кнопки, как ни нажимай - сперва приходит событие от них, только потом от второго направления.
Делать задержку реакции не хочется, будет впечатление, что интерфейс тормозит. Есть какой-то штатный ход? |
| quasist |
Понедельник, 27 октября 2008, 19:32
Отправлено
#2
|
|
Sing along at the Opera ![]() Группа: Профи Сообщений: 3 391 Регистрация: 06 янв. 2006 Пользователь №: 14 791 ![]() ![]() |
если ты про пятнашки, то советую завести "плавающий курсор"
при нажатии кнопки - он плавно перетекает в заданном направлении и когда дойдёт до следующей клетки (залезет этак на пяток пикселей), то тогда и передвигается сам большой курсор... ... хотя нафиг в пятнашках диагонали Если ты пишешь файтинг, и приём начинается с диагонали, то просто следует отслеживать очередь команд (хороший пример в тренировке Last Bronx) -------------------- 12 удачных сделок в барахолке gbx.ru
|
| radzh |
Понедельник, 27 октября 2008, 19:41
Отправлено
#3
|
|
Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 242 Регистрация: 07 авг. 2008 Пользователь №: 27 750 ![]() ![]() |
QUOTE (quasist @ Понедельник, 27 октября 2008, 19:32) если ты про пятнашки, то советую завести "плавающий курсор" при нажатии кнопки - он плавно перетекает в заданном направлении и когда дойдёт до следующей клетки (залезет этак на пяток пикселей), то тогда и передвигается сам большой курсор... ... хотя нафиг в пятнашках диагонали :). Я для примера. Если ты пишешь файтинг, и приём начинается с диагонали, то просто следует отслеживать очередь команд (хороший пример в тренировке Last Bronx) У меня снова головоломка, там кораблик из своей клетки передвигается в одном из восьми направлений. Проблема в том, что нажать одновременно (как у тебя в шаблоне) два направления невозможно, он по-любому сперва присылает либо вертикальную, либо горизонтальную кнопку. Я сделал задержку, которая ждёт 50 мс и, если больше ничего не приходит, то отрабатывает кнопку; соответственно, если приходит вторая кнопка, то отрабатывает, как диагональ. Но из-за этой задержки впечатление, что интерфейс тормозит, собака. Никакого чистого типового решения нет? |
| Hahahoj |
Вторник, 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 направлений ). При этом и недиагональные направления нажатые одновременно с кнопкой файра будут нормально срабатывать. -------------------- |
| Hahahoj |
Вторник, 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 В конце странички Вики есть исходники готового проектика с реализацией нормального управления. -------------------- |
| quasist |
Вторник, 28 октября 2008, 12:00
Отправлено
#6
|
|
Sing along at the Opera ![]() Группа: Профи Сообщений: 3 391 Регистрация: 06 янв. 2006 Пользователь №: 14 791 ![]() ![]() |
QUOTE (Hahahoj @ Вторник, 28 октября 2008, 00:32) и отпадает необходимость возится с разными модификациями GP2x и в дальнейшем Wiza ( там будет 8 направлений ) В gp2x тоже 8 направлений. Ты какую тулчейну юзаешь? -------------------- 12 удачных сделок в барахолке gbx.ru
|
| Hahahoj |
Вторник, 28 октября 2008, 14:44
Отправлено
#7
|
|
Зомби ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 10 730 Регистрация: 17 дек. 2004 Пользователь №: 12 002 ![]() ![]() |
В гп2х мк2 их всего 4. И комбинации.
Иногда кодеблоки с последним gcc, иногда брудшелл с первым. .ЗЫ Описался по недогляду. Имелся ввиду F200 и перемоденные некоторыми модами F100 Сообщение отредактировал Hahahoj - Вторник, 28 октября 2008, 18:53 -------------------- |
| quasist |
Вторник, 28 октября 2008, 15:05
Отправлено
#8
|
|
Sing along at the Opera ![]() Группа: Профи Сообщений: 3 391 Регистрация: 06 янв. 2006 Пользователь №: 14 791 ![]() ![]() |
QUOTE (Hahahoj @ Вторник, 28 октября 2008, 14:44) Зачем тогда у меня 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
|
| Hahahoj |
Вторник, 28 октября 2008, 18:48
Отправлено
#9
|
|
Зомби ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 10 730 Регистрация: 17 дек. 2004 Пользователь №: 12 002 ![]() ![]() |
Потому что у тебя не перемоденный джой и не F200
-------------------- |
| radzh |
Четверг, 30 октября 2008, 12:07
Отправлено
#10
|
|
Фанат ![]() ![]() ![]() Группа: Пользователи Сообщений: 242 Регистрация: 07 авг. 2008 Пользователь №: 27 750 ![]() ![]() |
QUOTE (Hahahoj @ Вторник, 28 октября 2008, 00:32) Лови "чиста типовой" шаблон из моего движка (описал всё что происходит, чтобы не осталось вопросов): Огромное душевное спасибо! :) Перебрал всё детально. К сожалению, необходимость вызова задержки типа AESync() всё равно создаёт впечатление, что интерфейс тормозит. Видимо, для динамичных игр надо вообще читать SDL_JoystickGetButton() напрямую. Теперь осталось поддержку стилуса прикрутить, и выложу на погляд новую цацку :) |
![]() ![]() |
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
| Упрощённая версия | Сейчас: Сб., 24 окт. 2026, 11:31 |




Понедельник, 27 октября 2008, 10:30











