Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: DirectInput в DirectX 9  (Прочитано 83837 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #60 : 21-09-2009 07:40 » 

Алексей1153++

А может можно проверить буферизированный ввод так:
Засунь в главном цикле, где PeekMessage() функцию Sleep( 10000 ); и нажимай/отпускай разные кнопки много раз. Если все нажатия и отпускания кнопок, которые были сделал за эти 10 секунд, придут, значит работает.

Только не совсем понимаю как это реализовать, зато уже не надо будет анализировать текстовый файл, а достаточно его один раз посмотреть или я не прав и почему не прав?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #61 : 21-09-2009 08:22 » 

zuze, меня ещё терзают тузики сомнений... Буферизированный ввод - это , так понимаю, когда раздельно
1) складывается в буфер
2) читается из буфера

то есть в одном потоке значения тупо считываются. То есть тут буфер ReadOny. Во втором потоке , через равные промежутки времени считываются все клавиши, и флаги заносятся в буфер (нажата-не нажата). Если хочется триггер, то вводим ещё буфер, параллельный этому: при переходе флага в первом буфере из 0 в 1 (нажали) сбрасываем флаг во втором (ещё не прочитали в первом потоке). Первый поток , если триггер ещё не защёлкнут, считает, что кнопка только что нажата. Выставляет защёлку и обрабатывает кнопку. Если защёлка уже выставлена - проходит мимо

WM_TIMER, кстати, может плавать, но для управления в игре потянет. А ещё одно кстати - во втором потоке таймер вообще не нужен, можно Sleep() обойтись
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #62 : 24-09-2009 09:38 » 

Я не неправилно сделал функцию isKeyDown и массив  keyboard[256] сделал в место char написал BYTE.

Код:
// Глобальная переменная
BYTE keyboard[256];

// Функция определения нажатой клавиши на клавиатуре
bool isKeyDown(char KeyCode)
{
            // Чистим буфер, иначе может получиться эфект залипшей клавиши
            ZeroMemory(keyboard, sizeof(keyboard));

// Полученние данных с клавиатуры
            if (FAILED(pInputDevice->GetDeviceState(sizeof(keyboard),(LPVOID)&keyboard)))
            return false;

if (keyboard[KeyCode] & 0x80)
{
  ofstream fout("1.txt", ios_base::out | ios_base::app);
  fout << GetTickCount(); // Запись в файл
  fout << "-\n";
  fout.close();
  return true;
}
else
  return false;
}

Что в результате записалось в текстовый файл после того как я один раз нажал на клавишу '1':

Цитата
11115583-
11115583+
11115593-
11115593+
11115613-
11115613+
11115623-
11115633+
11115643-
11115643+
11115663-
11115663+
11115673-
11115683+
11115693-
11115693+

Когда в другой раз нажал на клавишу '1' получилось в текстовом файле 12 записей, когда два раза нажал на клавишу '1' получилось в текстовом файле 40 записей.

Это значит что буферизованный ввод есть и он работает правильно?
« Последнее редактирование: 24-09-2009 10:26 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #63 : 24-09-2009 14:36 » 

Цитата
Это значит что буферизованный ввод есть и он работает правильно?

ответ будет такой же, как и на вопрос:

работает ли всё так, как ты задумал ? Ага
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #64 : 24-09-2009 23:23 » 

Я всего лишь хочу знать, данные о нажатых клавишах считываются с буфера и правельно ли это происходит?
Или всё работает также, как если был не буферизированный ввод, тоесть клавишу нажата - клавиша определена.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 25-09-2009 03:01 » 

я не понимаю вопрос (
Клавиши считываются - это факт. Они правильно считываются (железо исправно, драйвера исправны) - это тоже факт, так как иначе бы они не считывались Отлично
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #66 : 25-09-2009 12:18 » 

Прошу прощения, за плохое объяснение попробую ещё раз объяснить.

Так как можно делать внешне всё правильно, как в теории, но о чём то забыть и уже не будет буферизированного ввода или будет, только он будет работать неправильно (залипание клавиш [от этого я избавился] или будет работать как не буферизированный ввод) при этом ошибок при компиляции и запуске программы могут не быть. Вот я и хочу это проверить практически.
« Последнее редактирование: 25-09-2009 12:21 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #67 : 25-09-2009 14:24 » 

все недостатки, если они есть, обязательно выплывут при активной эксплуатации программы Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #68 : 25-09-2009 14:39 » 

Понятно, спасибо за разъяснение.
Сейчас буду переходить на программирование мышки. К стати, где то писалось что клавиатура может потеряться и надо ещё в функцию проверки клавиши добавлять код для восстановление клавиатуры, но так как у меня она пока ни разу не терялась я это код писать не буду.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #69 : 25-09-2009 19:10 » 

Алексей1153++

Код:
// Указатель на интерфейс DirectInput для мыши
LPDIRECTINPUT8 pInput2 = NULL;
//  Указатель на устройство ввода мышь
LPDIRECTINPUTDEVICE8 pInputDevice2 = NULL;

// Функция которая является входной точкой приложения
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    hInstance = hInst;

    windowsclass.cbSize = sizeof(WNDCLASSEX);
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hInst;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&windowsclass))
        return 0;

    hwnd = CreateWindowEx(NULL, "WINDOWSCLASS", "Загрузка Х-файла с вращением и камерой", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        0, 0, 770, 500, NULL, NULL, hInst, NULL);
    if (!hwnd)
        return 0;

    // Инициализация DirectInput
    InitDirectInput();
    InitDirectInputMouse();
    ...
    ...
    ...
}

// Функция обработки нажатия клавиш
bool EnterKey(float timeDelta)
{
if (pDirect3DDevice)
{
 ...
 ...
 ...
              if (isMouseDown(0))
                MessageBox(NULL, "Нажата левая клавиша мыши", "Сообщение", MB_OK);
 if (isMouseDown(1))
                MessageBox(NULL, "Нажата правая клавиша мыши", "Сообщение", MB_OK);
 if (isMouseDown(2))
                MessageBox(NULL, "Нажата центральная клавиша мыши", "Сообщение", MB_OK);
           }
           return true;
}

while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
...
                                    ...
                                    ...
}
else
                        {
           ...
                                    ...
                                    ...
}
}
DeleteDirectInput();
DeleteDirectInputMouse();

// Функция инициализация DirectInput мыши
bool InitDirectInputMouse(void)
{
    
    // Создание интерфейс устройства (Мышь)
    if (FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pInput2, NULL)))
        return false;

     // Создание устройства клавиатуры (Мышь)
     if (FAILED(pInput2->CreateDevice(GUID_SysMouse, &pInputDevice2, NULL)))
       return false;

     // Установка формата данных мыши
     if (FAILED(pInputDevice2->SetDataFormat(&c_dfDIMouse)))
       return false;

     // Установка уровня взаимодействия клавиатуры (совместный доступ) [Мышь]
     if (FAILED(pInputDevice2->SetCooperativeLevel(hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)))
       return false;

     // Захват доступа к клавиатуре (активизировать управление) [мышь]
     if (FAILED(pInputDevice2->Acquire()))
        return false;

     return true;
}

// Функция определения нажатой клавиши на мыши
bool isMouseDown(int Button)
{
// Чистим структуру, иначе может получиться эфект залипшей клавиши на мыши
mouse.lX = 0;
mouse.lY = 0;
mouse.lZ = 0;
ZeroMemory(mouse.rgbButtons, sizeof(mouse.rgbButtons));

// Полученние данных с мыши
    if (FAILED(pInputDevice->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse)))
       return false;

if (mouse.rgbButtons[Button] & 0x80)
  return true;
else
  return false;
}

// Функция освобождает захваченные ресурсы DeleteInput мыши
void DeleteDirectInputMouse(void)
{
if (pInputDevice2 != NULL)
            {
pInputDevice2->Unacquire();
pInputDevice2->Release();
pInputDevice2 = NULL;

}
}

Почему-то клавиши мыши не определяются, в чём дело и как поправить, я понимаю что с этим ты ещё не разбирался, но вдруг идея придёт?
« Последнее редактирование: 26-09-2009 09:20 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 26-09-2009 03:30 » 

а где заполнялось c_dfDIMouse ?
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #71 : 26-09-2009 03:37 » 

Это же вроде в спецификации DirectInput лежит её заполнять не надо, для клавиатуры я же не заполнял.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #72 : 26-09-2009 03:39 » 

тогда мысли закончились Улыбаюсь Отлаживай, разбирайся... А у меня выходной ))
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #73 : 26-09-2009 03:40 » 

Понятно, хорошо отдохнуть!!!
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #74 : 26-09-2009 09:17 » 

Прошу прощения за свою невнимательность.

Вот в чём дело было. У меня было так

Код:
// Полученние данных с мыши
if (FAILED(pInputDevice->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse)))
   return false;

А надо так

Код:
// Полученние данных с мыши
if (FAILED(pInputDevice2->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse)))
   return false;


Так как pInputDevice относится к клавиатуре, а не к мыши.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #75 : 26-09-2009 10:17 » 

к вопросу об глобальных переменных и пустых именах переменных Ага
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #76 : 27-09-2009 04:20 » 

Алексей1153++

Так что теперь перехожу к изучению DirectMusic. Если будут вопросы буду задавать. Ты всегда дельные ответы даёшь.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #77 : 27-09-2009 04:56 » 

со звуком самую малось делал, требовалось всего то wav файл проиграть Улыбаюсь Больше не сталкивался. Только там DirectSound, вроде, было
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #78 : 27-09-2009 05:00 » 

А DirectMusic работает только с WAV и MIDI, а DirectSound тоже есть я его буду затем изучать.
« Последнее редактирование: 27-09-2009 05:04 от zuze » Записан
Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines