Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2015, 00:45   #1
Smart92
Новичок
Джуниор
 
Регистрация: 29.05.2011
Сообщений: 2
По умолчанию Устройство ввода

Здраствуйте уважаемые. В ассемблере я не очень силен, недавно начал его изучать. Проблема в следующем. Если некая игра X в которой есть режим на двоих на одном экране, но игра наотрез отказывается видеть второго игрока (джойстик или любое вводимое устройство) потому что данный режим был получен изменением файлов. Покопавшись по интернету нашел заметки как включить управление для второго игрока:
Цитата:
Основным методом работы с геймпадом в ОС Windows является использование С++ API XInput. Следует отметить отсутствие инициализирующих функций, вы просто опрашиваете состояние контроллера:
{XINPUT_STATE state;
DWORD result=XInputGetState(0, &state);

if (result == ERROR_SUCCESS)
{
// Controller is connected
}
else
{
// Controller is not connected
}
}

Функция XInputGetState принимает в качестве параметров индекс контроллера (их может быть подключено несколько).
0 - индекс контроллера, который может быть в диапозоне от 0-3. Т.е. Первый джой - 0, второй - 1 и тд.
Запустив IDA Pro нашел соответствующие строки в коде (см. картинку).

При изменении строчки push [ebp+2D0h+nVirtKey] действительно пропадает управление для первого игрока с джойстика. Как поменять это значение чтобы откликался второй джойстик вместо первого?
Smart92 вне форума Ответить с цитированием
Старый 27.03.2015, 16:12   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Функция XInputGetState принимает в качестве параметров индекс контроллера, который может быть в диапозоне от 0-3. (первый джой - 0, второй - 1 и тд.)
Smart92, на мой взгляд, ты путаеш понятия.
В данном контексте подразумевается обработка клавиш управления конкретного джойстика, а не поддержка их количества. Тебе надо юзать конфигурационный файл игры (обычно файл *.cfg в папке с игрой), где может быть установлено их количество. ты-же пишеш:

Цитата:
потому что данный режим был получен изменением файлов
Если обратиться к документации, то получим:
Код:
XInputGetState(
  _In_   DWORD dwUserIndex,
  _Out_  XINPUT_STATE *pState
);
Цитата:
Вход: dwUserIndex [in]
Индекс контроллёра (0-3). Для определения текущего индекса, проиндексируйте контроллёр и посмотрите на выходное значение (*pState).

Выход: pState [out]
Указатель в структуру XINPUT_STATE, которая получает текущее состояние контроллёра. Если функция добивается успеха, выход - ERROR_SUCCESS. В противном случае - ERROR_DEVICE_NOT_CONNECTED. Функция не использует SetLastError для обработки ошибки.

Требования:
Windows 8 (XInput 1.4), DirectX SDK (XInput 1.3), обновления Windows (XInput 9.1.0)
..теперь всё ясно! Функция XInputGetState просто обращается к контроллёру, и если таковой имеется (ERROR_SUCCESS или *pState=0), считывает с него данные:
Код:
result=XInputGetState(0, &state);

if (result == ERROR_SUCCESS)
{
  if (state.Gamepad.wButtons & XINPUT_GAMEPAD_UP)
  {
     //нажата кнопка UP
  }
}
А то, что ты "изменил строчку push [ebp+2D0h+nVirtKey] и действительно пропало управление для первого игрока с джойстика", это само-собой! Ведь 2D0h - это порт контроллёра, изменив который ты пытался считать пакет "из космоса". nVirtKey (в этой строке) может иметь следующие значения:
Код:
UP          0x0001
DOWN        0x0002
LEFT        0x0004
RIGHT       0x0008
..и т.д.
Одним словом, XInputGetState принимает индекс контроллера, и структуру, куда возвращаются значения кнопок, и не позволяет изменить кол-во контроллёров. ИМХО
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 27.03.2015 в 16:18.
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
устройство цп flip11 Общие вопросы C/C++ 0 22.01.2013 04:29
usb-устройство LinkinCN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.03.2012 21:50
Написать рекурсивную процедуру для ввода с клавиатуры последовательности чи-сел (конец ввода – 0) и вывода её на экран в обратном netiv Паскаль, Turbo Pascal, PascalABC.NET 1 17.02.2012 18:14
Форматирование ввода в колонку dataGridView и проверка правильности ввода tumanovalex C# (си шарп) 1 31.05.2011 19:56
Как сделать запрет ввода букв в поле для ввода input zvezda_t PHP 1 27.12.2009 22:02